redis 全称 Remote Dictionary Server
Redis 应用场景:
服务端购物车、热点数据缓存、分布式全局锁、点赞/打卡/签到、消息队列、用户和关注/商品推荐、分布式全局序列、抽奖、数据存储源、电商产品筛选、计数器、排行榜…
Redis数据类型-String
HashMap
其中String 不是java 中的String,这里的String可以是
SET - - 存 入一个字符串键
SETNX - - 存入一个字符串键,若key存在操作失败
GET - -获取指定key的字符串
MSET - - 批量存入字符串键
MGET - - 批量获取指定key的字符串
DEL - - 删除指定key
分布式全局锁
上图是有弊端的,如果程序A拿到了锁,电脑突然断电,程序中断的时候,在Redis 中锁是没有释放的,导致死锁。这种情况应该使用过期键的功能,expire 设置失效时间。时间根据所需的业务设置。
分布式全局锁-伪代码
这段代码也是有弊端的,第三行和第四行代码是没有事务保障的,保障不了原子性,有可能发生调用del 方法。可以从Redis 方面解决,的运用Lua脚本组装在一起,可以保证原子性的。还可以通过SET的命令加一些可选的参数完成的。
缓存设计
我们使用Redis一般有两种做法:
Redis数据类型-String(Number)
INCRBY key increment - -对key进行数值相加
set numbertest 1 //1
incrby numbertest 100 //101
DECRBY key decrement - - 对key进行数值相减
INCR key - - 对key的自加一
DECR key - - 对key的自减一
应用场景:
Redis数据类型-String(bit)
GETBIT key offset - -获取key下标offset的值
SETBIT key offset value - -对key下标offset进行设值
BITCOUNT key[start][end] - - 统计start到end位置设值为1的数量
BITOPS op destkey[key…] - - 对多个key进行位计算【op(AND/OR/XOR/NOT)】
也是支持二进制的,可以存储图片、经常访问的网页。
应用:在线用户统计
这种方式的使用非常的节省空间,一个bit位就能标识一个用户,1KB大小能存储1B=8bit ,1024×8,可以存8192个,1G大概可以存储80亿个。
Redis数据类型-Hash散列键
HashMap
如果把String的结构,看成是K-V 的结构,Hash则是key-field-value的结构。
HSET - - 存入一个key filed散列结构
HSETNX - -存入一个key field,若key中field存在操作失败
HGET - - 获取指定key field
HMSET - - 批量存入key field
HMGET - - 批量获取指定key filed
HDEL - -删除指定key filed
HINCRBY - -对key filed 的数值进行加减操作
hset 和json区别,json是需要序列化和反序列化的,并没有完全提供在Redis层面field字段的相关操作。
缓存设计散列存储
与String类型相比,一个是三层结构一个是两层结构,针对Redis最近最少lru缓存淘汰策略,定时扫描,和对最外层key的管理是不涉及到field层的,用散列键操作的话,key是只有一个的,用key进行ttl的管理。使用散列的意义在于这样使用散列存储,可以将信息凝聚在一起,便于管理。从一定程度上可以避免误操作,减少key的冲突,减少内存/IO/CPU的消耗。散列键不能完全替代String的,分布式锁用散列键就是不能实现的,因为在field层是没有过期键功能的,只有key层是有过期键功能的,在hash结构中,二进制操作是不能原生使用的。当考量数据的分布时,是不能用到散列键的。
添加:HINCRBY{userID}:shoppingCart{goodsID}{count}
查询:HGET{userID}:shoppingCart
Redis数据类型-Hash散列键
HashMap
List是一个有序的列表,可以通过下标来访问的,teachers是key,后面是value.
如果想全部取出来,可以取0到-1。
LPUSH key value[value…] - -往key的列表键中左边放入一个元素,key不存在则新建
RPUSH key value[value…]- - 往key的列表键中右边放入一个元素,key不存在则新建
LPOP key - - 从key的列表键最左端弹出一个元素
RPOP key - - 从key的列表键最右端弹出一个元素
LRANGE key start stop - - 获取列表键从start下标到stop下标的元素
BLPOP key[key…]timeout - -阻塞的从key的列表键最左端弹出一个元素,若列表键中不存在元素,阻塞等待(timeout)秒,若(timeout)=0,一直阻塞
BLPOP key[key…]timeout - -阻塞的从key的列表键最右端弹出一个元素,若列表键中不存在元素,阻塞等待{timeout}秒,若{timeout}=0,一直阻塞( block阻塞)
应用:消息队列
这是一个典型的生产者与消费者模式,生产者可以不断的生产。
消息保存 LPUSH{andy}:subscribe{msgID}
最新消息列表获取LRANGE{andy}:subscribe 0 10 分页
Redis数据类型-Set
HashMap
HashSet作用:去重、无序
SADD key member[member…] - -往集合键key中存放元素,若key不存在则新建
SREM key member[member…] - -往集合键key中删除元素
SMEMBERS key - -获取集合键key中所有的元素
SCARD key - -获取集合键key的元素个数
SISMEMBER key member - -判断{member}元素是否存在于集合键key中
SPOP key {count} - -从集合键中选出{count}元素,并且从集合键key删除
应用:刷礼物/转发参与抽奖
应用:点赞、打卡、签到
Redis 数据类型-Set的运算
交集运算:SINTER key[key…]、SINTERSTORE destination key [key…]
并集运算:SUNION key[key…]、SUNIONSTORE destination key[key…]
差集运算:SDIFF key[key…]、SDIFFSTORE destination key[key…]
Redis数据类型-Zet(也叫做Sort Set)
ZADD key score element[…] - -往有序集合键Key中存在元素,若key不存在则新建。
ZREM key element[element…] - -从有序集合key中删除元素
ZSCORE key element - -获取有序集合key中{element}元素进行score值操作
ZINCRBY key increment element - -给有序集合key中{element}元素进行score值操作,若key不存在则新建,{element}元素不存在则新建后进行score值操作。
ZCARD key - -获取有序集合key中元素个数
ZREVRANGE key start stop[WITHSCORES] - -正序获取有序集合key从start下标到stop下标的元素。
ZREVRANGE key start stop[WITHSCORES] - -倒序获取有序集合key从start下标到stop下标的元素。
集合运算操作
ZUNIONSTORE destkey numkeys key[key…] - -并集计算
ZINTERSTORE destkey numkeys key[key…] - -交集计算
以上为并集计算,店101 在8月1号和8月2号全部的销售额
应用 :单日排行榜
485万就是score分值,链接的就是新闻ID。
新闻被点击:ZINCRBY hotnews:{date} 1 {newID}
获取排名前15:ZREVRANGE hotnews:{date} 0 15 WITHSCORES