数据存储

假设我们在MySQL数据库中有这样一张表:

mysql> desc user_info;
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
NAME varchar(50) YES NULL
age int(11) YES NULL
email varchar(50) YES NULL
addr varchar(100) YES NULL

在redis中, 我们希望可以按照name,age,email(组合)查询, 那么我们的redis存储可以这样规划:

hmset user_info.id.{id} name {name} age {age} email {email} addr {addr}

索引

sadd user_info.name.{name} {id1} {id2} {id3}
sadd user_info.age.{age} {id2} {id4} {id6}
sadd user_info.email.{email} {id1} {id3} {id9}

查询

keys模糊查询

//模糊查询name中含有keywords的记录
keys user_info.name.*keywords*

keys 支持正则匹配,但是Redis官网建议不要在prod环境使用这个命令,会降低性能。

Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code. If you're looking for a way to find keys in a subset of your keyspace, consider using SCAN or sets.

sets查询

//按name查询
smembers user_info.name.{name} //按age查询
smembers user_info.age.{age} //按email查询
smembers user_info.email.{email} //按name, age组合查询
sinter user_info.name.{name} user_info.age.{age}

注意

上面的查询都是精确 = 查询

scan查询

SCAN
SCAN 迭代当前数据库的key集合.
SSCAN
SSCAN 迭代指定Sets key集合的元素.
ZSCAN
ZSCAN 迭代指定Sorted Set key集合的元素.
HSCAN
HSCAN 迭代指定Hash key集合的field/value.

语法:

SCAN cursor [MATCH pattern] [COUNT count]

count 指定返回结果集的数量,默认为10,redis并能保证每次返回的都是count个结果

SCAN是基于游标(cursor)的,每次只返回少量的结果集,所以需要不停迭代cursor,只到cursor返回0,

127.0.0.1:6379> scan 0 count 5
1) "10" // 下一次迭代cursor的起始position
2) 1) "Key_6"
2) "Key_1"
3) "Key_4"
4) "Key_10"
5) "Key_5"
6) "Key_7" // 我们指定count为5,但返回了6条数据
127.0.0.1:6379> scan 10 count 5
1) "11" // 下一次迭代cursor的起始position
2) 1) "Key_8"
2) "Key_3"
3) "Key_11"
4) "Key_9"
5) "Key_2"
127.0.0.1:6379> scan 11 count 5
1) "0" // 0表示迭代结束
2) 1) "Key_12"

Match

这里需要注意下match执行的过程:

1, redis执行 scan x COUNT [count]

2, redis对上面的结果集进行match过滤,然后返回给client端

这就意味着,如果你使用了match过滤,则绝大多数情况下,client端每次收到的结果集数量都小于你指定的[count]数量。

// match 正则匹配, 返回含有'1'的key集合
127.0.0.1:6379> scan 0 count 5 match *1*
1) "10"
2) 1) "Key_1"
2) "Key_10"
127.0.0.1:6379> scan 10 count 5 match *1*
1) "11"
2) 1) "Key_11"
127.0.0.1:6379> scan 11 count 5 match *1*
1) "0"
2) 1) "Key_12"
// SCAN cursor [MATCH pattern] [COUNT count]
127.0.0.1:6379> sadd age.22 id_5 id_7 id_9 id_8 id_11 id_12 id_20
(integer) 7
127.0.0.1:6379> sscan age.22 0 count 5
1) "0"
2) 1) "id_7"
2) "id_5"
3) "id_11"
4) "id_8"
5) "id_9"
6) "id_20"
7) "id_12"
// HSCAN key cursor [MATCH pattern] [COUNT count]
127.0.0.1:6379> hmset user.id.1 name 'Troy Zhang' age 30 email 'java-koma@163.com' addr 'ChengDu, SiChuan, China' gender 'male' job 'Mobile Developer' phone '110' dept 'WEBOP CD'
OK
127.0.0.1:6379> hscan user.id.1 0
1) "0"
2) 1) "name"
2) "Troy Zhang"
3) "age"
4) "30"
5) "email"
6) "java-koma@163.com"
7) "addr"
8) "ChengDu, SiChuan, China"
9) "gender"
10) "male"
11) "job"
12) "Mobile Developer"
13) "phone"
14) "110"
15) "dept"
16) "WEBOP CD"

Scan特点:

1, Scan在redis server端是无状态的,任何时候你可以在中途中止迭代,而不需要通知redis server

2, 多个client可以同时迭代同一个cursor

Scan缺点:

1, count不能保证每次返回指定数量的结果集

2, 返回的key结果集有可能重复


总结

在prod环境下, redis建议使用scan,而不要使用 keyssmembers

Since these commands allow for incremental iteration, returning only a small number of elements per call, they can be used in production without the downside of commands like KEYS or SMEMBERS that may block the server for a long time (even several seconds) when called against big collections of keys or elements.

Redis 存储、查询的更多相关文章

  1. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  2. Redis 优化查询性能

    一次使用 Redis 优化查询性能的实践   应用背景 有一个应用需要上传一组ID到服务器来查询这些ID所对应的数据,数据库中存储的数据量是7千万,每次上传的ID数量一般都是几百至上千数量级别. 以前 ...

  3. 几分钟搞定redis存储session共享——设计实现

    前面我们写过C#在redis中存储常用的5种数据类型demo,没看过的可以点击电梯直达:https://www.cnblogs.com/xiongze520/p/10267804.html 我们上一篇 ...

  4. Redis 慢查询

    Redis 慢查询   许多存储系统提供慢查询日志帮助开发和运维人员定位系统的慢操作.慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值就将这条命令的相关信息记录下来Redis提供 ...

  5. 一次使用 Redis 优化查询性能的实践

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到 ...

  6. 大容量类Redis存储--Pika介绍

    嘉宾介绍 大家好,首先自我介绍一下,我是360 web平台-基础架构组的宋昭,负责大容量类redis存储pika的和分布式存储Bada的开发工作,这是我的github和博客地址,平时欢迎指正交流^^ ...

  7. redis 学习(10)-- redis 慢查询

    redis 慢查询 什么是慢查询 MySQL会记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询,都记在慢查询日志里. redis 的生命周期 客户端向Redis服务器发送命令 ...

  8. redis范围查询应用 数据库 数据库学习 Redis redis范围查询的方法

    redis范围查询应用. 需求 根据IP找到对应的城市 原来的解决方案 oracle表(ip_country): 查询IP对应的城市: 1.把a.b.c.d这样格式的IP转为一个数字,例如为把210. ...

  9. Java连接Redis,存储对象获取对象()byte和json),连接池

    Java连接Redis Jedis连接Redis,Lettuce连接Redis Jedis连接Redis 1. 创建maven项目 2. 引入依赖 <dependencies> <d ...

随机推荐

  1. 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 ...

  2. android MIPI屏 导航栏丢失

    /**************************************************************************** * android MIPI屏 导航栏丢失 ...

  3. 解决java switch……case不能匹配字符串的问题

    java1.7已经支持了匹配字符串 方案1. enum Animal { dog,cat,bear; public static Animal getAnimal(String animal){ re ...

  4. SharePoint Security and Permission System Overview

    转:http://www.sharepointblues.com/2010/09/01/sharepoint-security-and-permission-system-overview/ Shar ...

  5. 【转】ubuntu 编码 UTF-8 GBK GB18030

    添加编码支持 sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN.GB2312 sudo locale-gen zh_CN.GB18030 2.更新一下lo ...

  6. POJ 1155-TELE(树形背包)

    题意:电视台发送信号给很多用户,每个用户(叶子节点)有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 分析:问题与以i为根节点的子树所包含的叶子数 #incl ...

  7. Zabbix探索:Discovery任务、进程以及占用率

    刚刚又报错了,如下所示: Zabbix discoverer processes more than 75% busy 原因是,我配置了一个自动发现的任务.而每个自动发现的任务都会在一定时间内占用一个 ...

  8. POJ 1113&&HDU 1348

    题意:凸包周长+一个完整的圆周长.因为走一圈,经过拐点时,所形成的扇形的内角和是360度,故一个完整的圆. 模板题,之前写的Graham模板不对,WR了很多发....POJ上的AC代码 #includ ...

  9. Node与Express开发 坑1

    添加 app.set('views', __dirname + '/views') 修改 app.use(express.static(__dirname + '/public')); express ...

  10. office在线预览方案

    一.服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览 微软方:利用Office2007以上版本的一个PDF插件SaveAsPDFandXPS.exe可以导出PDF文件,然后再利用免 ...