Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是 intset 或者 hashtable。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
实例:
根据个人理解和便于学习,进行了简单的分类!
大致分为以下几类:
Redis Sdiff 命令返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集。
差集的结果来自前面的 FIRST_KEY ,而不是后面的 OTHER_KEY1,也不是整个 FIRST_KEY OTHER_KEY1OTHER_KEYN 的差集。
Redis Sinter 命令返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
Redis Sunion 命令返回给定集合的并集。不存在的集合 key 被视为空集。
下表列出了 Redis 集合基本命令:
String是redis最基础和最常用的数据结构,其值最大能存储 512MB,可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串。String底层使用的是SDS,是Redis的一种基本数据结构,主要是用于存储字符串和整数。
21 set命令 set key value
用于设置给定key的值,如果key存储了其他值,覆盖写入,无视类型。
22 get命令 get key
获取指定key的值,如果key不存在返回nil
23 getset命令 get key [value]
该命令用于获取指定的key的旧值,然后按照新值对key进行赋值。当key中没有旧值的时候返回nil。
24 mget命令 get key1 [key2 keyN]
返回多个key的值,某个key不存在时返回nil
25 decr命令 decr key
对key对应的数字做减1 *** 作。如果key不存在,那么在 *** 作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。
26 incr命令 incr key
对key对应的数字做减1 *** 作。如果key不存在,那么在 *** 作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。
27 append命令 append key value
如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加 *** 作,这种情况 APPEND 将类似于 SET *** 作。返回append后字符串值(value)的长度。
31 SDS动态字符串
struct sdshdr {
unsigned int len;
unsigned int free;
char buf[];
}
其中,buf表示数据空间,用于存储字符串;len表示buf中已占用的字节数;free表示空闲的字节数。
32 新的SDS结构
增加了一个flags来标识类型,用一个字节(8位)来存储,前3位表示字符串的类型;剩余5位,存储长度小于32的段字符串。
创建 SDS 的大致流程是这样的:首先根据字符串长度计算得到 type,根据 type 计算头部所需长度,然后动态分配内存空间。
注意:① 创建空字符串时,SDS_TYPE_5 被强制转换为 SDS_TYPE_8(原因是创建空字符串后,内容可能会频繁更新而引发扩容 *** 作,故直接创建为 sdshdr8)
②长度计算有 +1 *** 作,因为结束符 \0 会占用一个长度的空间。
③返回的是指向 buf 的指针 s。
41 session共享
42 计数器(商品浏览记录)
43 访问限速
list类型用来存储多个有序的字符串,列表当中的每一个字符看做一个元素,一个列表当中可以存储有一个或者多个元素,redis的list支持存储2^32次方-1个元素。
Redis可以从两端push和pop元素,支持读取指定范围或者制定下表的元素。list是一种灵活的链式结构,可以充当队列或者栈的角色。
list的元素是有序的,且列表内的元素是可以重复的。
注意:Redis32以前,列表底层的编码是ziplist(压缩列表)和linkedlist(双向列表)实现的,因为双线列表占用的内存比压缩列表多,所以当创建新的列表键时,列表会优先考虑用压缩列表,只有在需要的时候才会转换到双向列表实现。32以后重新引入了一个quicklist,列表底层都是有quicklist实现,quicklist是一个由ziplist组成的双向列表,每个节点使用ziplist来存储数据。
21 Lpush命令 lpush key value
将一个或多个值插入到列表头部。 如果 key 不存在,则创建list,然后再插入数据 *** 作。 当 key 存在但不是列表类型时,返回一个错误。
22 Rpush命令 rpush key value
将一个或多个值从list的尾部插入
23 Blpop命令 blpop key seconds
Blpop是取出列表的第一个元素,如果list中没有元素则会一直等到到超时,或者发现有数据为止,seconds是指定多少秒返回。如没有数据,则返回nil。
同理,Bropo为移除list列表的最后一个元素
24 Linsert命令 linsert key before/after val1 val2
在list列表的某一个元素前或者后插入另外一个元素。当指的的元素不存在时,不执行任何动作。如果列表不存在时,视为空列表,不执行任何动作。
25 Lindex命令 lindex key index
通过链表的下标获取列表中的元素,可以是-1表示链表最后一个元素,-2代表倒数第二个元素,没有返回nil
26 Llen命令 llen key
返回list的长度,如果list不存在,返回0
27 Lrange命令
返回指定list区间内的元素,区间以偏移量start和end决定。其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
51 队列秒杀抢购
list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。不过不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然没必要去重复造轮子。
52 排行榜
list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中。只有定时计算的排行榜才适合使用list类型存储,与定时计算的排行榜相对应的是实时计算的排行榜,list类型不能支持实时计算的排行榜。
在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。
1、config get requirepass 获取当前Redis的连接密码
2、CONFIG GET dir 启动的redis路径
3、config set requirepass "123123" 设置当前Redis的连接密码
4、auth 123123 密码验证
5、save 立刻持久化数据到dumprdb文件中 只管保存,其它不管,全部阻塞
6、bgsave Redis会在后台异步进行快照 *** 作 可以通过lastsave 命令获取最后一次成功执行快照的时间
7、flushall 也会产生dumprdb文件,但是里面是空的,无意义。
8、AOF 是以日志的形式记录每个 写 *** 作,AOF和RDB同时存在时,先使用AOF
9、redid-check-aof --fix append onlyaof 修复AOF文件
Spring对Redis的支持是通过Spring Data Redis实现的,JedisConnectionFactory为我们提供了Redis的一种Java客户端Jedis。本文主要为大家介绍使用工厂类获取Jedis的两种方式,以及使用过程中存在的问题,希望能为大家提供一些思路。
工具/材料IntelliJ IDEA
01首先我们需要编辑Spring的配置文件applicationproperties,添加Redis的相关配置,这些配置在代码中需要注入,用来生成JedisConnectionFactory的Bean。
02接下来我们写一个配置类,该配置类上需要添加@Configuration注解,我们在这个类中通过@Value注解注入applicationproperties配置文件中的部分需要的属性,其中{}用于接收属性值,在属性名冒号后面的值是默认值,若读取不到该属性则使用默认值。我们在该类中创建JedisConnectionFactory的Bean,在这个Bean中设置读取到的属性值。
03接下来我们创建一个RedisServer的类,主要用于获取Redis以及实现部分Redis *** 作的方法。在该类中我们可以使用@Autowired注解注入JedisConnectionFactory的Bean。下图中获取Redis客户端Jedis的方法是我们推荐的方法,使用该方法我们既获取到了Jedis实例又使用的连接池,将Jedis实例交由连接池管理,不用太担心并发 *** 作导致的Redis不可用的情况。最后再附上Jedis *** 作存储和获取数据的方法。
04另外,我们还有再介绍一种并不推荐的写法,如下图所示。这种方法每次都创建一个新的Redis连接并且没有关闭连接,在大量并发 *** 作时会带来性能上的开销,由于对连接数没有限制,可能会耗尽Redis的连接,导致Redis连接报错。
05配置完成后我们来测试一下Jedis是否能正常使用,创建一个RedisController类,在该类中注入JedisServer,使用JedisServer提供的存储和读取方法,然后启动服务。
06服务启动后我们在postman中进行测试,首先调用setRedis请求将数据存入Redis中,然后再调用getRedis请求获取数据,如下图所示。
07JedisConnectionFactory在Spring Data Redis 20后就不再推荐上述这种配置方式了,当我们的spring-boot-starter-parent版本设置为2x时,我们可以看到代码中的设置已经被废弃了。
08Spring Data Redis 20推荐使用Standalone、Sentinel、RedisCluster这三种模式的环境配置类,以便于更加灵活的适配更多的业务场景,我们一般自己测试Redis通常使用的都是单机版的,那么以单机版为例,JedisConnectionFactory的配置应写为如下的方式。
特别提示本文只是介绍了一种Redis客户端的使用方式,还是推荐大家使用spring-boot集成Redis做开发,因为spring-boot开箱即用的特性可以大大减少开发工作量。
以上就是关于redis | 六、redis之Set全部的内容,包括:redis | 六、redis之Set、Redis数据结构之string类型和list类型、如何获取redis中String类型的全部key值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)