美文网首页
Redis基本数据结构及应用案例

Redis基本数据结构及应用案例

作者: 王传贺 | 来源:发表于2020-12-31 00:05 被阅读0次

    一 :Redis 简介

    redis 是目前最受欢迎的NoSql 数据库,是以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。
    
    redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,此特性保证了数据的持久化。
    
    今天主要简单的介绍下 redis的五种数据结构及其简单运用。
    
    redis.png

    二 :String 结构与应用场景

    1、单值缓存

    set key value
    get key
    
    单值存储.png

    2、对象缓存

    mset key value [key value …]
    mget key [key …]
    
    对象存储.png

    3、分布式锁

    setnx key value [set if not exists]
    key 不存在时,设置成功,返回 1,key 存在则不做任何操作 返回0
    比如对一个商品 Logitech:gpw 进行加锁,因为redis 是单线程的,只有一个加锁成功,其他返回加锁失败,操作如下:
    
    分布式锁.png

    4、web集群session 共享

    使用spring session + redis 实现 session 共享
    

    5、计数器

    incr key
    应用场景 :
        ①:如右图的阅读数
        ②:对于自增需要的处理
    
    计数器.png 阅读案例.png
    
        @Autowired
        private RedisTemplate redisTemplate;
    
    
    /**
         * TS+日期+4位数字
         *
         * @return
         */
        public String getComplaintCode() {
            SimpleDateFormat dfst = new SimpleDateFormat("yyyyMMdd");
            String newDate = dfst.format(new Date());
            String complaintCode = "";
            Long incr = this.incr("complaintRepair" + newDate, 24);
            if (incr == 0) {
                incr = this.incr("complaintRepair" + newDate, 24);
            }
            DecimalFormat df = new DecimalFormat("0000");
            complaintCode = "TS" + newDate + df.format(incr);
            return complaintCode;
        }
    
        public Long incr(String key, long liveTime) {
            RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
            Long increment = entityIdCounter.getAndIncrement();
            if ((null == increment || increment.longValue() == 0) && liveTime > 0) {//初始设置过期时间
                entityIdCounter.expire(liveTime, TimeUnit.HOURS);
            }
            return increment;
        }
    

    三 :Hash 结构与应用场景

    1、单值缓存

        hset key field value 
        hset key field 
    
    单值缓存.png

    2、对象缓存

        hmset key field value [field value ...]
        hmget key field [field ...]
    
    对象缓存.png

    3、举例说明

    工作中很少用hset ,就举例说明:下图主要信息有 :购物车商品数量,购物车单个商品id及数量,可以全选商品,增加数量,删除商品等操作,具体如下
    
    购物车.png
    购物车 :
    ①:以用户id 为key
    ②:商品id 为field
    ③:商品数量为value
    
    购物车操作 :
    ①:添加商品  hset wangch:7456 bose:1 1
    ②:增加数量  hincrby wangch:7456 bose:1 1
    ③:商品总数  hlen wangch:7456
    ④:删除商品  hdel wangch:7456 bose:1    
    ⑤:获取购物车所有商品  hgetall wangch:7456
    
    购物车操作.png

    4、hash 结构的优缺点

    优点 :
    ①:同类数据归类整合存储,方便数据管理
    ②:相比于string操作内存和cpu更小
    ③:相比于string存储更节省空间
    
    缺点 :
    ①:过期功能不能使用在field上,只能使用在key上
    ②:redis集群架构下不适合大规模使用
    
    集群示例.png

    四 :List 结构与应用场景

    1、基础命令

    lpush key value [value …]
    value值 从左到右的顺序依次插入到表头   
    rpush key value [value ...]
    value值 从右到左的顺序依次插入到表头   
    lpop key
    移除并返回列表 key 的头元素
    rpop key
    移除并返回列表 key 的尾元素
    
    lrange key start stop
    返回列表key 指定区间内元素,区间以偏移量start和stop指定
    
    blpop key [key …] timeout
    从key列表表头弹出一个元素,若列表没有元素,阻塞等待timeout秒,如果timeout=0 ,一直等待下去
    
    
    brpop key [key …] timeout
    从key列表表尾弹出一个元素,若列表没有元素,阻塞等待timeout秒,如果timeout=0 ,一直等待下去
    
    List操作示例.png

    2、常用数据结构

    Stack(栈)=lpush + lpop (先进后出)
    
    栈操作.png
    Queue(队列)=lpush + rpop (先进先出)
    
    队列操作.png
    Blocking MQ (阻塞队列)=lpush + brpop
    
    会话一阻塞.png
    会话二新增数据.png 会话一获取数据.png

    3、微信公众号消息流

    ①:Java3y 推送消息,消息id为 222
            lpush msg:wangch 222
    
    ②:Hollis 推送消息,消息id为 444
            lpush msg:wangch 444
    
    ③:查看最新的公众号消息
            lrange msg:wangch 0 4
    
    公众号示例.png 操作示例.png
    此种方式适用于粉丝量小的公众号推送方式
    

    五 :Set 结构与应用场景

    1、set 常用操作

    sadd key member [member]   新增元素 ,  元素唯一不重复
    srem key member [member]   删除元素
    smembers key               获取集合key 所有元素
    scard key                  获取集合key 元素个数
    sismember key member       判断元素是否存在于集合key
    srandmember key [count]    从集合key中取出count个元素,元素不删除
    spop key [count]           从集合key中取出count个元素,元素删除
    

    2、应用实例 :微信抽奖小程序

    ①:点击参与抽奖加入集合
        sadd key wangch
    ②:查看参与抽奖所有用户
        smembers key
        (scard key : 查看抽奖个数)
    ③:抽取count 名中奖者
        srandmember key [count]/ spop key [count]
        
    (也可以用于点赞,收藏等场景)
    
    抽奖.png
    抽奖示例.png

    3、set 运算操作

    sinter key [key …]              交集运算
    sunion key [key …]              并集运算
    sdiff key [key …]               差集运算    
    
    举例说明.png
    sinter set2 set3 set3 --> {c}
    sunion set2 set3 set3 --> {a,b,c,d,e}
    sdiff set2 set3 set3 --> {a}
    

    4 、应用实例 :集合操作实现关注模型

    ①:wangch关注的人
        sadd wangch zhangxh、lisi、wangwu 
    ②:小明关注的人
        sadd xiaom  lisi、 wangwu、zhaol
    ③: 李四关注的人
        sadd lisi  xiaom 、zhaol、 xiaoq
    获取 wangch 和小明的共同关注
        sinter wangch xiaom --> {lisi、wangwu}
    我关注的人也关注了他(小明)
         sismember lisi xiaom --> 返回 1 存在,
                                        则也关注了
    我可能认识的人
        sdiff wangch xiaom --> {zhangxh}
    
    关注.png
    操作示例.png
    可用于淘宝推荐商品:共同关注的人越多,说明兴趣爱好相同。当A购买一件商品时,就可能给你也推荐
    

    六 : ZSet 结构与应用场景

    1、ZSet 常用操作

    sadd key score member [[scoremember] …]     有序集合key加入带分值元素
    srem key member [member]                    有序集合删除元素
    zscore key member                           返回有序集合key中元素member分值
    zcard key                                   有序集合key中的元素个数
    zrange key start stop [withscores]          正序获取key从start下标到stop下标元素
    zrevrange key start stop [withscores]       倒序获取key从start下标到stop下标元素
    

    2、 ZSet 集合操作

    zunionstore destkey numkeys key  [key...]   并集操作
    zinterstore destkey numkeys key  [key...]     交集操作
    
    ZSet.png

    3、 ZSet 实现微博排行榜

    实现基础 : zset 数据会根据score自动排序,我们将点击次数作为zset ,随着用户点击实时变化
    ①:展示当日排行前十 (按照score倒序)
        zrevrange hot:20201229 0 9 withscores
    ②:累计计算近七日点击次数   
        zunionstore hot:20201222-2021229 7hot:20201222 hot:20201223 … hot:2021229
    ③:展示七日排行前十
         zrevrange hot:20201222-2021229  0 9 withscores
    
    微博热搜.png

    4、 ZSet 其他应用

    zset 还可以用来实现延迟队列、接口限流等操作,主要是使用score 的特性,以时间戳作为score,来达到相应逻辑。
    

    相关文章

      网友评论

          本文标题:Redis基本数据结构及应用案例

          本文链接:https://www.haomeiwen.com/subject/ssbkoktx.html