redis 全称 Remote Dictionary Server
优质的性能保证定时异步刷盘单K-V容量1GB(相比memcache 1MB)丰富的数据类型(一共支持有8种,常用5种) String:最基本的数据类型,二进制安全的字符串,最大512M list:按照添加顺序保持顺序的字符串列表 Hash:key-value对的一种集合 Set:无序的字符串集合,不存在重复的元素 SortSet:已排序的字符串集合 bitmap:更细化的一种操作,以bit为单位 hyperloglog:基于概率的数据结构 Geo:地理位置信息储存起来, 并对这些信息进行操作Redis 应用场景: 服务端购物车、热点数据缓存、分布式全局锁、点赞/打卡/签到、消息队列、用户和关注/商品推荐、分布式全局序列、抽奖、数据存储源、电商产品筛选、计数器、排行榜…
Redis数据类型-String HashMap<String,Object> 其中String 不是java 中的String,这里的String可以是
字符串(String)数值(Number)二进制(bit)SET - - 存 入一个字符串键 SETNX - - 存入一个字符串键,若key存在操作失败 GET - -获取指定key的字符串 MSET - - 批量存入字符串键 MGET - - 批量获取指定key的字符串 DEL - - 删除指定key
分布式全局锁
上图是有弊端的,如果程序A拿到了锁,电脑突然断电,程序中断的时候,在Redis 中锁是没有释放的,导致死锁。这种情况应该使用过期键的功能,expire 设置失效时间。时间根据所需的业务设置。
分布式全局锁-伪代码 这段代码也是有弊端的,第三行和第四行代码是没有事务保障的,保障不了原子性,有可能发生调用del 方法。可以从Redis 方面解决,的运用Lua脚本组装在一起,可以保证原子性的。还可以通过SET的命令加一些可选的参数完成的。
缓存设计 我们使用Redis一般有两种做法:
存入结构化(序列化)数据合理的key设计配合批处理API如下图表所示: 可以通过下列方式处理:
这种方式修改数据还是比较方便的。
Redis数据类型-String(Number) INCRBY key increment - -对key进行数值相加
set numbertest 1 //1 incrby numbertest 100 //101DECRBY key decrement - - 对key进行数值相减 INCR key - - 对key的自加一 DECR key - - 对key的自减一
应用场景:
计数器: 全局序列 在分布式中一个表可能有多个节点的,这种可以使用Redis自增加。 这方式有缺点,增加了与Redis 的频繁IO请求。很少用这种方式。 多种情况下应用以下方式。 在真正的实现过程中,在Redis中一次性取一段, 这里取的是1000个数,返回本地的内存中,为了下次用的时候直接从内存自增就行了,这样就减缓了跟Redis的访问。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,HashMap<String,Object>> 如果把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}:shoppingCartRedis数据类型-Hash散列键 HashMap<String,List<Object>> 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<String,HashSet> 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删除
应用:刷礼物/转发参与抽奖
刷礼物、转发微博加入到抽奖的集合键中SADD抽奖key{userID}SMEMBERS抽奖key 获取所有用户,滚动列表转起来SPOP抽奖key[count]/SRANDMEMBER抽奖key[count]抽取count名中奖者应用:点赞、打卡、签到 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)
salesV 销售额 storeID某个门店ID date
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在使用周榜、月榜、年榜可以用以下结构: