Redis知识点汇总(更新中)

通用命令

  • redis-cli: 登录redis客户端程序
  • auth 密码: 输入密码登录
  • EXPIRE key second: 设置一个key的有效期
  • TTL key: 查看key还有多长时间过期
  • keys *:查看当前库所有的key
  • exists key: 判断某个key是否存在
  • type key 查看你的key是什么类型
  • del key: 删除指定的key数据
  • unlink key: 非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
  • ttl key: 查看还有多少秒过期,-1表示永不过期,-2表示已过期
  • expire key 秒钟: 为给定的key设置过期时间
  • move key dbindex(0-15): 将当前数据库的 key移动到给定的数据库 db 当中
  • select dbindex: 切换数据库【0-15】,默认为0
  • dbsize: 查看当前数据库key的数量
  • flushdb: 清空当前库
  • flushal: 通杀全部库

String类型

  • SET : 添加一个新的键值对, 或者修改一个已经存在的键值对

    可选项

    这些可选项在其他类型的命令中大多也可以用, 不是只能string类型的value用

    • EX seconds: 以秒为单位设置过期时间

    • PX mi1liseconds: 以毫秒为单位设置过期时间

    • EXAT timestamp: 设置以秒为单位的UNIX时间戳所对应的时间为过期时间

    • PXAT milliseconds-timestamp: 设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间

    • NX: 键不存在的时候设置键值

    • XX: 键存在的时候设置键值

    • KEEPTTL:保留设置前指定键的生存时间

    • GET:返回指定键原本的值,若键不存在时返回ni1

  • GET key : 根据key获取string类型的value

  • MSET key1 value1 key2 value2 ...: 批量添加多个string类型的键值对

  • MGET key1 key2 key3...: 根据多个key获取多个String类型的value

  • INCR key : 让一个整型的key自增1

  • INCRBY key increament: 让一个整形的key自增指定步长increament

  • INCRBYFLOAT key increament: 让一个浮点型数字自增指定步长increament

  • SETNX key value : 添加一个string类型的键值对, 前提是这个键值对不存在, 如果存在则不执行

  • SETEX key second: 添加一个string类型的键值对, 并且指定有效期秒second

  • APPEND key value:将value的值追加到key的后面

  • STRLEN key: 获取key的长度


String类型表示JSON数据

KEYVALUE
user:1{name:‘jack’,age:21}
user:2{name:‘luck’,age:22}

哈希类型

哈希类型的结构表

KEYVALUE
fieldvalue
heima:user:1name张三
age18
heima:user:2name李四
age20

  • HSET key field value:添加或者修改hash类型key的field的值

  • HGET key field:获取一个hash类型key的field的值

  • HMSET:批量添加多个hash类型key的field的值

  • HMGET:批量获取多个hash类型key的field的值

  • HGETALL:获取一个hash类型的key中的所有的field和value

  • HKEYS:获取一个hash类型的key中的所有的field

  • HINCRBY:让一个hash类型key的字段值自增并指定步长

  • HSETNX key field value:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

  • HKEYS hash: 获取hash这个key对应的所有field

  • HVALS hash: 获取hash这个key对应的所有field的所有value

List类型

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。

特征也与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

List的常见命令有:

  • LPUSH key element ... :向列表左侧插入一个或多个元素

  • LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil

  • RPUSH key element ... :向列表右侧插入一个或多个元素

  • RPOP key:移除并返回列表右侧的第一个元素

  • LRANGE key start end:返回一段角标范围内的所有元素

    如果start = 0, end = -1 表示遍历全部

  • BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

  • LINDEX list index: 按照索引index获取list中的元素

  • LLEN key: 获取列表list的长度

  • LREM key N val: 删除列表key中N个值为val的元素

  • LTRIM key start end: 截取列表key中的start索引到end索引范围中的值后再赋值给列表key

  • RPOPLPUSH 源列表 目标列表: 表示移除源列表的最右侧的元素(rigth) 并添加到目标列表的最左边(left)

  • LSET key index value: 修改列表key指定索引中的元素, 修改为value

  • LINSERT key BEFORE/AFTER 已有值 新值:表示在列表key中的已有值前面(before)或者后面(after)插入新值

Set类型

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  • 无序

  • 元素不可重复

  • 查找快

  • 支持交集、并集、差集等功能

Set的常见命令有:

  • SADD key member ... :向set中添加一个或多个元素

  • SREM key member ... : 移除set中的指定元素

  • SCARD key: 返回set中元素的个数

  • SISMEMBER key member:判断一个元素是否存在于set中

  • SMEMBERS:获取set中的所有元素

  • SCARD: 获取集合里面的元素个数

  • SRANDMEMBER key n: 从集合中随机展示n个元素, 元素不删除

  • SPOP key n: 从集合中随机弹出n个元素, 元素弹出后删除元素

  • SMOVE key1 key2 member: 从key1中移出member到key2中


    集合运算

  • SINTER key1 key2 ... :求key1与key2的交集

  • SINTERCARD numkeys key [key...] [LIMIT limit]: 不返回结果集, 而只返回结果基数

    具体用法:

    ​ 如: SINTERCARD 2 key1 key2 limit 3

    ​ 解释: 2表示要查看几个集合的交集

    ​ key1 key2 表示具体的set

    ​ limit是可选的, 后面跟什么数字就显示几个结果

    ​ 比如key1 key2 的交集一共有3个 分别是1 a b

    ​ 用这个命令则返回3 ,如果用SINTER key1 key2命令则返回具体的结果1 a b

    ​ 如果limit后面是 2 的话, 则结果就是 2

  • SDIFF s1 s2: 求s1与s2的差集

  • SUNION s1 s2: 求key1和key2的并集

    差集: s1和s2的差集就是s1里面有, s2里面没有的

    并集: s1和s2的所有元素 (重复元素只记录一次)

SortedSet类型

Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。

SortedSet具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

SortedSet的常见命令有:

  • ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值

  • ZREM key member:删除sorted set中的一个指定元素

  • ZSCORE key member : 获取sorted set中的指定元素的score值

  • ZRANK key member:获取sorted set 中的指定元素的排名

  • ZCARD key:获取sorted set中的元素个数

  • ZCOUNT key min max:统计score值在给定范围内的所有元素的个数

  • ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值

  • ZRANGE key min max [WITHSCORES]:按照score排序后,获取指定排名范围内的元素

  • ZRANGEBYSCORE key min max [WITHSCORES]:按照score排序后,获取指定score范围内的元素

    这个指令默认是大于等于min, 小于等于max的范围

    加了 ( 则表示不包括min或者max

    比如ZRANGEBYSCORE key (50 (70 表示范围在50到70之间, 不包括50和70

  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:

  • 升序获取sorted set 中的指定元素的排名:ZRANK key member

  • 降序获取sorted set 中的指定元素的排名:ZREVRANK key member

Bitmap类型

Redis中的位图(Bitmaps)是一种特殊的数据结构,它实际上是一个非常大的二进制数组,其中的每个元素(位)只能存储两种值:0 或 1。位图在Redis中被用于高效地处理集合和布尔型数据,尤其适用于大数据集的处理,因为它能够以极低的空间消耗存储大量的数据。

位图的每个位对应一个特定的偏移量(offset),这个偏移量通常用来表示某个特定的属性或状态。例如,你可以使用位图来跟踪一亿用户每天的登录状态,其中第N个位表示第N个用户是否登录过。

Bitmap的常见命令:

  • SETBIT key OFFSET value: 设置或修改位图中指定偏移量位置的位的值

    key表示指定某个位图

    offset 的位置应该填一个数字, 表示指定偏移量

    value 表示要存入的值

  • GETBIT key OFFSET: 获取位图中指定偏移量位置的位的值

    OFFSET表示偏移量的值, 类似于数组的索引的作用

  • STRLEN: 统计字节数占多少

    这里不是统计有多少个bit, 而是统计有多少个字节被修改了, 返回的是字节的数量

  • BITCOUNT key: 统计这个key中一共有多少个1

  • BITOP operation destination_key key [key ...]: 用于对两个或多个位图进行位逻辑运算,并将结果保存到一个新的位图中

    它可以执行四种不同的位运算 写在operation

    • AND:按位与运算
    • OR:按位或运算
    • XOR:按位异或运算
    • NOT:按位取反运算

HyperLogLog类型

HyperLogLog是一种概率算法,专门设计用于在大数据集上高效估算不同元素的个数,即基数(cardinality)。当数据集非常庞大时,直接存储所有元素并计算其基数会消耗大量的内存资源。HyperLogLog算法能够在有限的内存中给出一个近似但足够精确的基数估计值。

基数: 统计一个一个集合中不重复的元素的个数, 就是对集合中去重后的元素的计算

HyperLogLog的常见命令:

  • PFADD key element [element...]: 添加指定元素到HyperLogLog中
  • PFCOUNT key [key...]: 返回给定的HyperLogLog的基数估算值
  • PFMERGE destkey sourcekey [sourcekey...]: 将多个HyperLogLog合并成一个HyperLogLog

GEO类型

Redis的GEO功能是在Redis 3.2版本中引入的,它允许用户存储和操作地理位置信息。GEO功能主要基于Sorted Set数据结构实现,但是它使用了一种特殊的编码方式——GeoHash,来将地理位置的经纬度坐标转换为可以排序的数值,从而使得基于位置的查询变得高效。

GEO常用命令:

  • GEOADD key 经度 纬度 value [经度 纬度 value...]:向key中添加一条或多条数据

  • GEOPOS key member [member...]: 从给定的key中返回所有指定名称member的经纬度, 不存在的返回nil

  • GEOHASH key member [member...]:返回member中存放的经纬度的GEOHASH表示

  • GEODIST key member1 member2 [m|km|fm|mi]:统计两个位置之间的距离, [m|km|fm|mi]表示不同的距离单位

  • GEORADIUS key 经度 纬度 radius unit [WITHDIST] [WITHHASH] [WITHCOORD] [ASC|DESC] [COUNT count] [STORE destination] [STOREDIST destination]: 根据给定的经纬度坐标和半径,找到存储在特定键中的所有地理位置成员,这些成员在指定的地理范围内

    radius: 指定查询的半径。

    unit:指定半径的单位,可以是 m (米),km (千米),mi (英里),或 ft (英尺)。

    可选项:

    • WITHDIST: 如果设置,返回结果会包含距离。
    • WITHHASH:如果设置,返回结果会包含GeoHash值。
    • WITHCOORD:如果设置,返回结果会包含经纬度坐标。
    • ASCDESC:指定结果的排序方式,升序或降序。
    • COUNT count:限制返回的结果数量。
    • STORE destination:如果设置,结果会被存储到指定的Sorted Set键中,而不返回给客户端。
    • STOREDIST destination:如果设置,结果的距离会被存储到指定的Sorted Set键中,而不返回给客户端。

Stream类型

Redis Stream是Redis 5.0版本引入的一种新的数据结构,它主要用于实现消息队列(Message Queue)的功能。与传统的列表(List)或发布/订阅(Pub/Sub)模式相比,Redis Stream提供了更强大的特性和持久性,使其成为处理实时数据流的理想选择。

在这里插入图片描述

名词解释
1Message Content消息内容
2Consumer group消费组,通过XGROUP CREATE 命令创建,同一个消费组可以有多个消费者
3Last_delivered_id游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。
4Consumer消费者,消费组中的消费者
5Pending_ids消费者会有一个状态变量,用于记录被当前消费已读取但未ack的消息Id,如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为 PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理

特殊符号:

  • - +:最小和最大可能出现的id
  • $: 表示只消费新的消息,当前流中最大的 id,可用于将要到来的信息,
  • >: 用于XREADGROUP命令,表示迄今还没有发送给组中使用者的信息,会更新消费者组的最后ID
  • *: 用于XADD命令中,让系统自动生成id

队列相关指令

  • XADD key * field value....: 添加消息到stream的末尾

    *表示服务器自动生成MessageID

    也可以自己指定值

  • XRANGE start end [COUNT count]:用于获取消息列表

    start表示开始值, -表示最小值

    end表示结束值, +表示最大值

    count表示最多获取多少个值

  • XRANGE end start [COUNT count]:用于获取消息列表(降序版)

  • XDEL key id [id....]: 根据id(MessageID) 删除一个或者多个消息

  • XLEN key: 获取stream中的消息个数

  • XTRIM MAXLEN|MINID number: 用于对stream的长度进行截取

    MAXLEN表示stream的最大长度, 对流进行修剪限制长度

    MINID允许的最小id, 比此id小的都被抛弃

  • XREAD key [COUNT count] [BLOCK milliseconds] STREAMS key [key...] ID [ID...]: 用于获取一条或者多条消息

    可选项:

    • COUNT: 最多读取多少条消息

    • BLOCK: 是否以阻塞的方式读取消息, 默认不阻塞, 如果milliseconds设置0 表示永远阻塞

    • ID: 这里写0-0代表从最小的ID开始获取Stream中的消息

    ​ 写$则表示以当前Stream已经存储的最大的ID作为最后一个ID,当前不存在大于当前最大ID的消息,因此此时返回nil


消费组相关指令

  • XGROUP CREATE key 消费者组名称 MessageID: 用于创建消费者组, 指定MessageID表示从stream流中哪个消息开始消费

    ID为0表示从头开始消费

    ID为$ 表示只消费新的消息

  • XREADGROUP GROUP group consumer STREAMS key >: 读取指定stream流中的信息

    group指定是哪个消费组

    consumer指定是消费组中的哪个消费者

    STREAMS表示以流的形式读

    key表示指定哪个stream流

    >表示从第一条尚未被消费的消息开始读取

    stream中的消息一旦被消费组中的任意一个消费者读取了, 就不能再被该消费组中的其他消费者读取了,即同一个消费组里的消费者不能消费用一条消息 此时如果重复读取, 得到的值就是nil

  • XPENDING key group [consumer] [- +] [COUNT] : 查询每个消费组内消费者已读取但未确认的消息

    只使用XPENDING key group的时候, 其只输出有关给定消费组的待处理消息的概要

    可选项:

    • consumer: 可选参数,如果提供,则只显示属于这个消费者的未确认消息。
    • count: 可选参数,返回的未确认消息的最大数量。
    • - +: 表示筛选消息的范围, - + 表示所有未确认的消息
  • XACK key group MessageID: 向消息队列确认消息处理已经完成

  • XINFO STREAM|GROUP|CONSUMER streamname|groupname|consumername: 用于打印STREAM|GROUP|CONSUMER的详细信息

设置消费组的目的:

让组内的多个消费者共同分担读取信息, 所以, 通常让每个消费者读取部分信息 ,从而实现消息读取负载在多个消费者之间, 达到负载均衡.

redis持久化

RDB

RDB(Redis DataBase): 指的是在指定的时间间隔以内, 执行数据集的时间点快照

实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是

快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。

这个快照文件就称为RDB文件(dump.rdb),其中,RDB就是Redis DataBase的缩写。

自动触发

需要在redis配置文件中配置频率

手动触发

AOS

Jedis客户端

Jedis的官网地址: https://github.com/redis/jedis

1.1 入门

先来个快速入门:

1)引入依赖:

<!--jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.7.0</version>
    <scope>test</scope>
</dependency>

2)建立连接

新建一个单元测试类,内容如下:

private Jedis jedis;

@BeforeEach
void setUp() {
    // 1.建立连接
    // jedis = new Jedis("192.168.150.101", 6379);
    jedis = JedisConnectionFactory.getJedis();
    // 2.设置密码
    jedis.auth("123321");
    // 3.选择库
    jedis.select(0);
}

3)测试:

@Test
void testString() {
    // 存入数据
    String result = jedis.set("name", "虎哥");
    System.out.println("result = " + result);
    // 获取数据
    String name = jedis.get("name");
    System.out.println("name = " + name);
}

@Test
void testHash() {
    // 插入hash数据
    jedis.hset("user:1", "name", "Jack");
    jedis.hset("user:1", "age", "21");

    // 获取
    Map<String, String> map = jedis.hgetAll("user:1");
    System.out.println(map);
}

4)释放资源

@AfterEach
void tearDown() {
    if (jedis != null) {
        jedis.close();
    }
}

1.2.SpringDataRedis客户端

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

API返回值类型说明
redisTemplate.opsForValue()ValueOperations用来操作String类型的数据
redisTemplate.opsForHash()HashOperations操作Hash类型数据
redisTemplate.opsForList()ListOperations操作List类型数据
redisTemplate.opsForSet()SetOperations操作Set类型数据
redisTemplate.opsForZSet()ZSetOperations操作SortedSet类型数据
redisTemplate通用的命令

这些方法可以向redis中存储各种类型的数据,包括简单类型和引用类型,如果想把引用数据类型存入redis中,默认要先进行序列化,然后将序列化之后的字符串存入redis中。但是通过这种方法存入的数据可读性较差。

StringRedisTemplate类

使用这个工具类只能存入string类型的key和value,如果想要存对象,需要把对象先序列化成JSON字符串,再存入。

    @Test
    void testUser() {
        //创建对象
        User user = new User("张三", 21);
        //手动将对象序列化为json字符串
        String jsonString = JSON.toJSONString(user);
        //写入数据
        stringRedisTemplate.opsForValue().set("user:200",jsonString);

        //获取数据
        String user200 = stringRedisTemplate.opsForValue().get("user:200");
        //反序列化
        User parseObject = JSON.parseObject(user200, User.class);
        //打印输出
        System.out.println(parseObject);
    }

这里使用的JSON工具类是FASTJOSN2 (待续)

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值