1.String
1)常用命令: value类型可以是:字符串,数字,二进制
2)应用:
分布式锁
1 设置字符串key,若存在则设置失败 SETNX("key",value)==1//设置成功获取锁 SETNX("key",value)==0)//资源已经被占用,设置失败 2 业务处理完毕释放分布式锁 del(key); 3 设置锁失效时间,防止宕机,系统运行意外,导致锁无法释放 EXPRISE("key","有效时间)
public synchronized boolean lock(String key, Integer expire) { RedisConnection connection = getConnection(); try { log.info("使用redis加锁 key:{},expire={}",key,expire); Boolean setNX = connection.setNX(key.getBytes(), "value".getBytes()); if (setNX) { connection.expire(key.getBytes(), expire); log.info("已获取到锁 key:{},expire={}",key,expire); } return setNX; } catch (Exception e) { log.error("使用redis加锁发生异常(key:{} ",key,e); return false; } finally { connection.close(); } }
计数器:
1 INCR key // INCR readcount::{帖子ID} 2 Get key// get readcount::{帖子ID}
分布式全局序列:
2.Hash
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
1)常用命令
是一个类似于:HashMap<String,HashMap<String,String>类型的数据结构
面试题:
1)hash键的意义何在?
1 hash键可以将信息凝聚在一起,而不是直接分散的存储在整个redis中,这不仅方便了数据管理,可以避免一点的误操作。?
2 避免键名冲突
3 减少内存占用
2)不能使用hash键的情况:
1过期功能的使用,过期功能只能使用在key上;(因为里面是存的 key field value 只能对key 设置过期,没法真正的对field 设置过期,所以说不支持分布式锁)
2 二进制操作命令如:SETBIT、GETBIT、BITOP
3 需要考虑数据分布的问题(是根据key,做hash算法,如果key 一样无论如何hash都是在同一台机器上面,那么就失去了分布式的意义)
3.List
1)常用命令
2)应用:
实现阻塞消息队列:
实现用户消息列表
暖暖userID(201)关注:青山老师,TOM老师,科比,登科
1 青山老师发微博,消息ID为1201
LPUSH 201 1201
2 TOM老师发消息,消息ID为1202
LPUSH 201 1202
分页获取201的消息列表:LRANGE 201 0,1*10 (分页获取)
索引下标 | 消息ID |
0 | 1201 |
1 | 1202 |
2 | 1203 |
4.Set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
1)常用命令
2)应用
实现直播刷礼物,转发参加抽奖活动
SADD key {userid}_1 刷礼物,转发微博加入到集合键中
SMEMBERS key 获取所有用户,大轮盘转起来
SPOP key count/SRANDMEMBER key [count] 抽取 count名中奖者 :SRANDMEMBER key [count](返回集合中一个或多个随机数)
实现点赞,签到,like等功能
点赞:SADD kile::8001(被赞者) 1001(当前点赞用户)
取消点赞:SREM like::8001 1001 (从集合中移除1001)
检查用户是否点过赞:SISMEMBER like::8001 1001 (SISMEMBER :判断 member 元素是否是集合 key 的成员)
获取用户的点赞列表:SMEMBERS like::8001(SMEMBERS返回集合中的所有成员)
获取点赞用户数:SCARD like::8001 (scard:获取集合的成员数)
基于集合运算实现关注模型(可能认识的人)
Seven关注的人:sevenSub:{qing,mic,james}
青山关注的人:qingSub:{seven,jack,mic,james}
Mic关注的人:micSub:{seven,james,qing,jack,tom}
我和青山共同关注:SINTER sevenSub,qingSub {mic,james} (返回给定所有集合的交集)
我(Seven)关注的人也关注他:SISMEMBER mincSub (遍历我关注的人员列表,判断是否在他的关注列表中,在表示同时关注了他,否则则没有关注) (判断 member 元素是否是集合 key 的成员)
我可能认识的人:SDIFFSTORE sevenMayKnow qingSub sevenSub{seven,jack}
SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中,以key1为基准,在key2中不存在的,即为差集
实现商品筛选
SINTER
实现订单系统与支付系统间对账
5.Zset
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。有序集合的成员是唯一的,但分数(score)却可以重复。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
1)常用命令
2)应用
实现排行榜(单日,周,月,年)
日排行榜
点击
ZINCRBY hotNews:20200113 1 文章标题 (ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment)
展示排行:倒序取10条,并携带score的值,score值为搜索值
ZREVRANGE hotNews::20200113 0 10 withscores (ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低)
周排行榜
ZUNIONSTORE
ZUNIONSTORE destination numkeys key [key ...]计算给定的一个或多个有序集的并集,并存储在新的 key 中