公用命令
命令 | 注解 |
---|---|
SET key value | 增加键值对 |
KEY * | 查询当前库的所有键 |
EXISTS key | 判断某个键是否存在 |
TYPE key | 查看建的类型 |
DEL key | 删除某个键 |
EXPIRE key 过期时间 | 为键值对设置过期时间(单位:秒) |
TTL key | 查看还有多少秒过期(-1表示永不过期 -2表示已过期) |
DBSIZE | 查看当前数据库的key值的数量 |
FLUSHDB | 清空当前库 |
FLUSHALL | 通杀全部库 |
String
常用操作
string类型是二进制安全的,redis的string可以包含任何数据,如图像、序列化对象。一个键最多能存储512MB。二进制安全是指,在传输数据的时候,能保证二进制数据的信息安全,也就是不会被篡改、破译;如果被攻击,能够及时检测出来
命令 | 注解 |
---|---|
GET key | 查询相应的键值对 |
SET key value | 增加键值对(key区分大小写) |
APPEND key value | 将给定的<value> 追加到原值的末尾 |
STRLEN key | 获取值得长度 |
SETNX key value | 在value不存在得时候 设置key得值,若存在,则不做任何变化 |
INCR key | 将key中存储的数字值增1(只能对数字值操作,如果为空,新增值为1) |
DECR key | 将key中存储的数字值减1(只能对数字值操作,如果为空,新增值为-1) |
INCRBY/DECRBY key <步长> | 将key中储存的数字值增减,自定义步长 |
MSET key1 value1 key2 value2 | 同时设置一个或者多个key-value |
MGET key1 value1 key2 value2 | 同时获取一个或多个value |
MSETNX key1 value1 key2 value2 | 同时设置一个或者多个key-value(当且仅当所有给定都不存在) |
GETRANGE key 起始位置 结束位置 | 获取值的范围(类似java中的substring) |
SETRANGE key 起始位置 value | 用<value> 写<key> 所储存的字符串值,从起始位开始 |
SETEX key 过期时间 value | 设置键值的同时设置时间(单位-秒) |
GETSET key value | 以旧换新,设置了新值同时获得旧值 |
应用场景
-
计数器:常规Key-Value缓存应用,如微博数、粉丝数、阅读数。INCR本身就具有原子性特性,所以不会有线程安全问题
INCR article:readcount:{文章id}
GET article:readcount:{文章id}
-
WEB集群共享
spring session +redis实现session共享
-
分布式系统全局序列号
INCRBY orderld 1000 //redis批量生成序列号提升性能
Hash
个人理解hash是双重key-value ,key指的是最外层键,field-value 指的是值,field指的是最内层键,value指的是值。hash是一个Mapmap,指值本身又是一种键值对结构,如 value={{field1,value1},…fieldN,valueN}}
常用操作
命令 | 注解 |
---|---|
HSET key field value | 存储一个哈希表key的键值 |
HSETNX key field value | 存储一个不存在的哈希表key的键值 |
HMSET key field value [field value …] | 在一个哈希表key中存储多个键值对 |
HGET key field | 获取哈希表key对应的field值 |
HMGET key field [field …] | 批量获取哈希表key中多个field键值 |
HEDL key field [field … ] | 删除哈希表key中的field键值 |
HLEN key | 返回哈希表key中field的数量 |
HGETALL key | 返回哈希表key中所有键值对 |
HINCRBY key field increment | 为哈希表key中field键的值加上增量increment |
应用场景
- 对象缓存
HMSET user {userId}:username cuihao {userId}:age 18
例:HMSET user 1:username cuihao 1:age 18
HMGET {userId}:username {userId}:age
例:HMGET 1:username 1:age
- 淘宝购物车
例如:
命令 | 注释 |
---|---|
hset cart:1007 10081 1 | 添加用户id为1007的商品id为10081的信息(10081为商品id,数量为1) |
hset cart:1007 10081 9 | 修改用户id为1007的商品id为10081的数量为9 |
hincrby cart:1007 10081 1 | 添加用户id为1007的商品id为10081的数量为1 |
hincrby cart:1007 10081 -1 | 减少用户id为1007的商品id为10081的数量为1 |
hdel cart:1007 10081 | 删除用户id为1007的商品id为10081的信息 |
hget cart:1007 10081 | 获取用户id为1007的商品id为10081的数量 |
hgetall cart:1007 | 获取用户id为1007的所有商品信息 |
优缺点
-
优点
1)同类数据归类整合储存,方便数据管理
2)相比string操作消耗内存与cpu更小
3)相比string操作更节省空间
-
缺点
1)过期功能不能使用到field上,只能使用到key上
2)redis集群架构下不适用大规模使用
List
List 说白了就是链表(redis 使用双端链表实现的 List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。
使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。本人还用一个场景,很合适—取行情信息。就也是个生产者和消费者的场景。LIST可以很好的完成排队,先进先出的原则
常用操作
命令 | 注解 |
---|---|
LPUSH/RPUSH key value1 value2 | 从最左边/最右边插入一个或者多个值 |
LRANGE key start stop | 按照索引下标获得元素(从左到右 从零开始) |
LINDEX key index | 按照索引下标获得元素(从左到右 从零开始) |
LLEN key | 获取列表长度 |
LPOP key | 从左侧移除一个元素(即移除第一个元素) |
RPOP key | 从右侧移除一个元素(即移除最后一个元素) |
BLPOP key1 key2 timeout | 从key列表表头弹出一个元素,若没有元素,阻塞等待timeout秒,若timeout=0,则一直阻塞等待 |
BRPOP key1 key2 timeout | 从key列表表尾弹出一个元素,若没有元素,阻塞等待timeout秒,若timeout=0,则一直阻塞等待 |
应用场景
-
常用数据结构
Stack(栈)=LPUSH+LPOP ->FILO 栈:先进后出
Queue(队列)=LPUSH+LPOP 队列:先进先出
Blocking MQ(阻塞队列)=LPUSH +BRPOP
-
微博和微信公众号消息流
Set
集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。
常用操作
命令 | 注释 |
---|---|
SADD key member1 member2 | 往集合key中注入元素,元素存在则忽略,若key不存在则新建 |
SREM key member1 member2 | 从集合key中删除元素 |
SMBMBERS key | 获取集合key中的所有元素 |
SCARD key | 获取集合key中元素的个数 |
SISMEMBER key member | 判断member元素是否存在于集合key中 |
SRANDMEMBER key [count] | 从集合key中选中count个元素,元素不从key中删除 |
SPOP key [count] | 从集合key中选中count个元素,元素从key中删除 |
运算操作
命令 | 注释 |
---|---|
SINTER key1 key2 | 交集运算 |
SINTERSTORE destination key1 key2 | 将交集结果存入新集合destination中 |
SUNION key1 key2 | 并集运算 |
SUNIONSTORE destination key1 key2 | 将并集结果存入新集合destination中 |
SDIFF key1 key2 | 差集运算 |
SDIFFSTORE destination key1 key2 | 将差集结果存入新集合destination中 |
应用场景
- 微信抽奖小程序
- 微信微博点赞、收藏、标签
- 集合操作实现微博微信关注模型
zset
有序集合和集合有着必然的联系,保留了集合不能有重复成员的特性,区别是,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。
有序集合中的元素不可以重复,但是score 分数 可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相同。
常用操作
命令 | 注释 |
---|---|
ZADD key score member [[score member]…] | 往有序集合key中加入带分值元素 |
ZREM key member1 member2 | 从有序集合key中删除元素 |
ZSCORE key member | 返回有序集合key中元素member的分值 |
ZINCRBY key increment member | 为有序集合key中元素member的分值加上increment |
ZCARD key | 返回有序集合key中元素个数 |
ZRANGE key start stop [WITHCORES] | 正序获取有序集合key从start下标到stop下标的元素 |
ZREVEANGE key start stop [WITHSORES] | 反序获取有序集合key从start下标到stop下标的元素 |
集合操作
命令 | 注释 |
---|---|
ZUNIONSTORE destkey numkeys key1 key2 | 并集计算 |
ZINTESTORE destkey numkeys key1 key2 | 交集计算 |
应用场景
- 微博排行榜
更多应用场景
- 微博、微信、陌陌<附近的人>
- 微信<摇一摇> <抢红包>
- 滴滴打车、摩拜单车<附近的车>
- 美团和饿了么<附近的餐馆>
- 搜索自动补全
- 布隆过滤器