数据存储

假设我们在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. [原]Unity3D深入浅出 - Shader基础开发

    概述 简单来讲,shader是为渲染管线中的特定处理截断提供算法的一段代码.Shader是伴随着可编程渲染管线出现的,开发者可使用Shader对渲染过程加以控制,拥有更大的创作控件,因此Shader的 ...

  2. javascript中this的使用

    终于知道某些大神在写js插件的时候为什么第一句都是"var that=this",来看看下面的这个例子,大家都会懂啦: <script type="text/jav ...

  3. HAOI2007 理想的正方形

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1402  Solved: 738[Submit][Sta ...

  4. 【转】提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果

    原文网址:http://www.zhimengzhe.com/IOSkaifa/37910.html MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显 ...

  5. 常用的js代码

    1.输入框输入提示代码 <input name="keyword" type="text" value="请输入关键字" onFocu ...

  6. Erlang入门(四)——错误处理和鲁棒性

    去了趟福州,事情没搞定,托给同学帮忙处理了,回家休息了两天就来上班了.回家这几天最大的收获是第四次重读<深入Java虚拟机>,以前不大明了的章节豁然开朗,有种开窍的感觉,水到渠成,看来技术 ...

  7. mycat分布式mysql中间件(数据库切分概述)[转]

    mysql数据库切分 前言 通 过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时 候,我们还是会面临到扩展 ...

  8. FOJ 1608 Huge Mission 线段树

    每个节点维护一个最小值,更新发现如果大于最小值,直接向下更新.速度还可以.. #include<cstdio> #include<algorithm> #include< ...

  9. 转:eclipse导入工程中文乱码问题

    eclipse之所以会出现乱码问题是因为eclipse编辑器选择的编码规则是可变的.一般默认都是UTF-8或者GBK,当从外部导入的一个工程时,如果该工程的编码方式与eclipse中设置的编码方式不同 ...

  10. iOS程序性能优化

    iOS程序性能优化 一.初级 使用ARC进行内存管理 在iOS5发布的ARC,它解决了最常见的内存泄露问题.但是值得注意的是,ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露, ...