Redis 存储、查询
数据存储
假设我们在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 | ||
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可以同时迭代同一个cursorScan缺点:
1, count不能保证每次返回指定数量的结果集
2, 返回的key结果集有可能重复
总结
在prod环境下, redis建议使用scan,而不要使用 keys 和 smembersSince 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 存储、查询的更多相关文章
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- Redis 优化查询性能
一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到服务器来查询这些ID所对应的数据,数据库中存储的数据量是7千万,每次上传的ID数量一般都是几百至上千数量级别. 以前 ...
- 几分钟搞定redis存储session共享——设计实现
前面我们写过C#在redis中存储常用的5种数据类型demo,没看过的可以点击电梯直达:https://www.cnblogs.com/xiongze520/p/10267804.html 我们上一篇 ...
- Redis 慢查询
Redis 慢查询 许多存储系统提供慢查询日志帮助开发和运维人员定位系统的慢操作.慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值就将这条命令的相关信息记录下来Redis提供 ...
- 一次使用 Redis 优化查询性能的实践
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,一次使用 Redis 优化查询性能的实践 应用背景 有一个应用需要上传一组ID到 ...
- 大容量类Redis存储--Pika介绍
嘉宾介绍 大家好,首先自我介绍一下,我是360 web平台-基础架构组的宋昭,负责大容量类redis存储pika的和分布式存储Bada的开发工作,这是我的github和博客地址,平时欢迎指正交流^^ ...
- redis 学习(10)-- redis 慢查询
redis 慢查询 什么是慢查询 MySQL会记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询,都记在慢查询日志里. redis 的生命周期 客户端向Redis服务器发送命令 ...
- redis范围查询应用 数据库 数据库学习 Redis redis范围查询的方法
redis范围查询应用. 需求 根据IP找到对应的城市 原来的解决方案 oracle表(ip_country): 查询IP对应的城市: 1.把a.b.c.d这样格式的IP转为一个数字,例如为把210. ...
- Java连接Redis,存储对象获取对象()byte和json),连接池
Java连接Redis Jedis连接Redis,Lettuce连接Redis Jedis连接Redis 1. 创建maven项目 2. 引入依赖 <dependencies> <d ...
随机推荐
- Java线程池的工作原理与实现
简单介绍 创建线程有两种方式:继承Thread或实现Runnable.Thread实现了Runnable接口,提供了一个空的run()方法,所以不论是继承Thread还是实现Runnable,都要有自 ...
- poj2月题解
竟然生日前一天poj破百,不错不错,加速前进! poj2437 由于泥泞不重叠,所以按其实左边排个序再统计一遍即可(如果不是刚好盖满就尽量往后盖) poj2435 细节bfs poj2230 求欧拉回 ...
- HDU 1532 Drainage Ditches 排水渠(最大流,入门)
题意: 给出一个有向图,以及边上的容量上限,求最大流.(有重边,要将容量上限叠加) 思路: 用最简单的EK+BFS解决.每次搜到一条到达终点的路径,就立刻退出,更新ans,然后再回头修改图中的当前fl ...
- 图片处理 Pillow
Pillow 在python3下用PIL做图像处理 Python图像处理库:Pillow 初级教程 from PIL import Image im = Image.open('22.gif') pr ...
- 如何创建,增加swap
使用分区做为SWAP比较好,速度比文件的快,也不容易产生磁盘碎片所有应该尽量使用分区作为SWAP. 先说说使用文件做为SWAP吧:一.因为做为SWAP的文件,必须是连续的,所以需要使用dd命令创建:[ ...
- 学习面试题Day06
1.字节流的处理方式 字节流处理的是计算机最基本的单位byte,它可以处理任何数据格式的数据.主要的操作对象就是byte数组,通过read()和write()方法把byte数组中的数据写入或读出. 2 ...
- android之APN
APN全称是Access Point Name,中文即接入点,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络. android系统把所有的APN都保存在数据库中,数据库绝对 ...
- MyEclipse 下用link 方式安装插件
N年之前,也是Java出身,后来转DBA,Java 就忘的差不多了. 最近计划好好研究下Python,还是选用MyEclipse 这个IDE了,多年没敲代码,很多东西都忘记了,做点笔记,备用. M ...
- UPC OJ 一道水题 STL
Problem C: 字符串游戏 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 10 Solved: 3 [Submit][Status][Web ...
- Python脚本控制的WebDriver 常用操作 <十八> 获取测试对象的css属性
测试用例场景 当你的测试用例纠结细枝末节的时候,你就需要通过判断元素的css属性来验证你的操作是否达到了预期的效果.比如你可以通过判断页面上的标题字号以字体来验证页面的显示是否符合预期.当然,这个是强 ...