Rredis五中数据类型

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 中

 

posted @ 2020-01-13 20:39  暖暖-木木  阅读(359)  评论(0编辑  收藏  举报