• Redis系列之常见数据类型应用场景



    Redis支持多种数据类型,比如String、hash、list、Set、SortedSet、Streams、Bitmap、Hyperloglog、Geo(物理位置)等等,在官网也给出了说明,本博客就挑一些比较常有的数据类型说说,本文例子基于Redisson实现

    在这里插入图片描述

    String

    简单介绍

    在Redis中,所有的数据都是key-value的数据结构存储的,那么在Redis中这个string类型的value值只能存储String类型的数据?其实不然,redis中string类型的value值是可以支持多种类型的,比如String、Number、Float、Bits等等,但是最大还是只能存储512M。Redis中key也是string类型存储的,所以最大也只能存储512M

    常见命令

    setget命令就不演示了,下面给出一些常有命令

    批量设置多个key

    mset tkey1 tvalue tkey2 111
    

    批量获取多个key值

    mget tkey1 tkey2
    

    获取长度

    strlen tkey
    

    字符串后面追加内容

    append tkey tstring
    

    获取指定范围的字符

    # 取0~3之间的字符,返回1tst
    getrange tkey 0 3
    

    key进行递增(整数)

    # 返回1
    incr ikey
    # 递增指定大小的值,返回124
    incrby ikey 124
    

    key进行递增(浮点数)

    # 设置初始浮点数值
    set fkey 1.2
    # 在原来基础上递增2.4,返回3.6
    incryfloat fkey 2.4
    

    加上key过期时间

    expire tkey 10
    

    分布式锁实现,set if not exists,可以使用setnx单个命令,也可以使用set结合nx命令来实现

    # set tkey过期时间10秒,nx:如果键不存在时设置
    set tkey aaa ex 10 nx
    # setnx命令,相当于set和nx命令一起用
    setnx tkey aaa
    

    EX : 设置指定的到期时间(以秒为单位)。

    PX : 设置指定的到期时间(以毫秒为单

    NX : 仅在键不存在时设置键。

    XX : 只有在键已存在时才设置。

    String 更多指令请参考官网文档:https://redis.io/commands/?group=string

    应用场景

    对于Redis String类型的应用场景也比较多,比如很常有的做缓存处理,也可以用于分布式锁、分布式ID

    分布式锁的实现主要依赖于命令setnx

    分布式ID主要是利用incr这个命令

    基于Redis实现一个分布式ID生成器

    package com.example.redis.common.handlers;
    
    import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    
    /**
     * 
     *      Redis分布式ID生成器
     * 
    * *
     * 修改记录
     *    修改后版本:     修改人:  修改日期: 2023/11/07 14:18  修改内容:
     * 
    */
    @Component public class RedisIdentifierGenerator implements IdentifierGenerator { @Resource private RedisTemplate redisTemplate; @Override public Number nextId(Object entity) { String key = entity.getClass().getName(); return redisTemplate.opsForValue().increment(key); } }

    Hash

    简单介绍

    Hash哈希,数据类型也是一种比较常见的数据结构,相对于Redis的string类型而言,其实就是多了一层key(field),所以说只要string类型适用的场景,hash都是支持的

    常见命令

    hash设置key为hkey,field为a的值

    hset hkey a aaaa
    

    获取hkey的field值

    hget hkey a
    

    设置多个field值

    hmset hkey a 1 b 2 c 3 d 4
    

    获取多个field值

    hmget hkey a b c d
    

    获取key所有的field

    hkeys hkey
    

    获取key所有field的值

    hvals hkey
    

    获取key所有fileld和值

    hgetall hkey
    

    在这里插入图片描述

    给key某个字段field添加值

    hincrby hkey a 10
    

    在这里插入图片描述

    对于Hash的更多命令,请参考:https://redis.io/commands/?group=hash

    应用场景

    对于hash的应用场景,其实只要redis string类型适用的,hash都是适用的,不过hash这种特殊的数据结构,还是适用于一些特殊场景的

    • 存储一个对象类的数据,这个对象的多个字段就对应hash的field
    • 存储一些统计类的数据,比如访问量、点击量等等

    如图,如果要统计博客的pv、uv还有评论数量(evaluation_count),随着博客数量的增加存储到数据库里,后面肯定会查询比较慢,所以可以使用redis进行缓存

    在这里插入图片描述

    使用Redisson来写一个例子:

      @Resource
        private RedissonClient redissonClient;
    
        @Test
        void contextLoads() throws ExecutionException, InterruptedException {
            RMap redissonClientMap = redissonClient.getMap("recordMap");
            Map map = new HashMap<>();
            map.put("pv" , 1000);
            map.put("uv" , 1500);
            map.put("evaluation_count",30)
            redissonClientMap.putAll(map);
            System.out.println(redissonClientMap.addAndGet("pv", 2));
        }   
    

    List

    简单介绍

    redis中的数据类型存储有序的字符串列表,元素是可以重复,列表的最大长度为2^32-1个元素(4294967295),即每个列表超过40亿个元素

    常见命令

    左右添加元素

    # 左边添加元素
    lpush queueList a
    lpush queueList b c
    
    # 右边添加元素
    rpush queueList d e
    
    

    左右弹出第一条

    # 左边弹出一个元素
    lpop queueList
    # 右边弹出一个元素
    rpop queueList
    

    左右弹出一个元素,并且设置超时,直到无数据弹出或者超时

    blpop queueList 10
    brpop queueList 10
    

    应用场景