目录

  • String
    • 简单介绍
    • 常见命令
    • 应用场景
  • Hash
    • 简单介绍
    • 常见命令
    • 应用场景
  • List
    • 简单介绍
    • 常见命令
    • 应用场景
  • Set
    • 简单介绍
    • 常见命令
    • 应用场景
  • Sorted Set(Zset)
    • 简单介绍
    • 常见命令
    • 应用场景
  • Bitmap
    • 简单介绍
    • 常见命令
    • 应用场景
  • 附录

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之间的字符,返回1tstgetrange tkey 0 3

key进行递增(整数)

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

key进行递增(浮点数)

# 设置初始浮点数值set fkey 1.2# 在原来基础上递增2.4,返回3.6incryfloat 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  修改内容: * 

*/@Componentpublic 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 alpush queueList b c# 右边添加元素rpush queueList d e

左右弹出第一条

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

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

blpop queueList 10brpop queueList 10

应用场景

  • 微信公众号、微博等消息流列表

    RDeque recordList = redissonClient.getDeque("recordList");recordList.addFirst("1.新闻1");recordList.addFirst("2.新闻2");recordList.addFirst("3.新闻3");IntStream.range(0,3).forEach(a->{    System.out.println(recordList.poll());});
  • 消息队列,使用redis也可以实现消息队列,比如使用rpush/lpop实现简单队列;blpop或者是brpop来实现阻塞读取队列;补充说明,同时streampub/sub(订阅发布模式)、sortedSet等等也是可以实现的

    不过还是不建议使用Redis来实现消息队列,因为我们已经有成熟的MQ框架,使用redis实现队列有可能有下面的问题:

    • 存在内存,可能会有数据丢失,不能重复消费
    • 消费后不能回应,没有ack确认机制
  • Set简单介绍

    Redis中的Set类型是无序集合,最大存储数量为2^32-1,大概有40亿左右,添加、删除元素的时间复杂度都是O(1)

    常见命令

    添加一个或者多个元素

    sadd skey a b c d e f g h

    获取所有的元素

    smembers skey

    获取集合元素的个数

    scard skey

    随机获取一个元素

    srandmember skey

    随机弹出一个元素

    spop skey

    弹出指定的元素

    # 如果两个元素都有,返回2srem skey a g

    检查元素是否存在

    # 元素存在返回1sismember skey e

    获取前一个集合有,而后面一个集合没有的元素

    sdiff skey skey1

    获取集合的交集

    sinter skey skey1

    获取集合的并集

    sunion skey skey1

    Set的更多命令请参考:https://redis.io/commands/?group=set

    应用场景