key-value数据库Redis
前言
Redis(Remote Dictionary Server ),即远程字典服务,Redis是完全免费开源的,遵守BSD协议,是一个高性能的(NoSQL)的key-value 数据库
2022年各大数据库的排行榜
NoSQL,泛指非关系型数据库,NoSQL即Not-Only SQL。它可以作为关系型数据库的良好补充。随着Web2.0的兴起,非关系型数据库形成了一个极高的新领域,非关系型数据库产品的发展也非常迅速。
在传统的关系型数据库在应付Web2.0网站,特别是超大规模的和高并发的SNS类型的Web2.0,暴露出很多的问题
NoSQL的出现就是为了解决这些问题
一、Redis基础掌握
1.1 Redis描述
redis是个完全开源免费的,是一个高性能的NoSQL的key-value的数据库
,redis是一个开源的使用ANSI C语言编写的,支持网络协议,可基于内存亦可持久化的日志型,Key-value数据库。
1.2Redis的特点
- 性能极高-由于数据是存储在内存中(Redis能读的速度是110000次/s,写的速度是81000次/s)
- 丰富的数据类型 -redis支持String、 Hash、 Set 、Order set、 List等数据类型
- 原子性 Redis的所有操作都是原子性的,意思是要么都成功,要么都失败,通过
Multi和EXEC来实现
- 丰富的特性 redis还支持Publiish/subscribe ,通知,key过期等等特性
- 高速读写 redis用自己实现分离器,代码量少,没有使用lock(MySQL)因此效率很高
Redis 是一个简单的,分布式的,高效的,基于内存的缓存工具。
架构好服务器后,通过网络连接(类似于数据库),组织Key-Value是缓存服务
简单,是Redis突出的特点
简单的保证每个Redis命令都是线程安全的
1.3 Redis的应用场景
- 缓存
- 排行榜
- 计数器
- 热点数据
1.4 Redis安装
redis安装目录介绍 | 目录位置 |
---|---|
官网下载安装目录 | /opt |
普通Redis安装目录 | /usr/local/redis |
Docker安装 | /usr/local/docker/redis |
Redis集群安装 | redisCluster 6台服务器 |
1.4.1 安装前准备
可以看到目前最新的稳定版本是7,Redis更新相当快,这里我使用的是5版本,> > 官方推荐使用的是Linux系统进行安装
在安装Redis前必须要有一个Linux的操作系统来进行安装。
1.4.2 Redis正式安装
① 打开虚拟机使用xshell连接虚拟机
② 通过xftp将redis的安装包进行上传
我一般习惯于将所有的安装文件统一的上传上opt目录下
,在此目录下新建一个文件夹命名为software
③ 解压Redis压缩包
tar -zvxf redis压缩包的名字 -C /opt/software
④ 检查Linux系统的c语言环境,并安装
因为Redis是由C语言编写的,所以我们需要使用c语言的编译环境
首先,我们需要先进入到解压后的redis目录下,然后我们在make使用c语言进行编译
cd /opt/software/redis解压后的文件名
ll -- 查看文件夹下的所有文件
yum install gcc-c++
-- 进入到目录后。执行make编译
make
make install //确认安装的东西
⑤ 启动Redis服务端和客户端
redis-server /opt/redis安装目录/redis.conf
redis-cli - h ip地址 -p 端口号 [密码]
ps -ef | grep redis --查看redis的服务是否被启动
修改核心配置文件来完成Redis以守护线程的方式来运行
⑥ Redis配置文件
1️⃣基础配置
redis的核心配置文件 redis.conf【默认的目录在etc目录下】
- daemonize 是用来修改守护线程方式启动的配置属性,默认是no不开启
daemonize yes -- 开启以守护线程的方式启动
- bind 绑定启动的redis的端口号
绑定一个本机的ip地址,否则只能在linux虚拟机上进行访问
- pidfile /var/run/redis_6379.pid 守护线程的进程号
- port redis启动时的端口号 默认是6379
- timeout 0 是当客户端闲置多长时间,连接超时
0表示关闭此功能
- databases 16 redis默认的数据库个数是16个
通过select 数据库的个数来进行选择不同数据库
select 1 -- 选择数据库
2️⃣redis持久化配置
- save表示redis的持久化操作的时间
- dbcompress yes 数据库压缩开启,redis默认是开了数据库的压缩的,说明:如果不开启数据库的压缩,会导致数据库因数据量巨大而效率低下
- 数据库备份文件方式 redis默认的备份持久化策略有两种
1、 RDB策略
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
rdb保存的文件是dump.rdb 都是在我们的配置文件中快照中进行配置的!
优点:
(1)适合大规模的数据恢复;
(2)对数据的完整性要求不高。
缺点:
(1)需要一定的时间间隔进程操作,如果redis意外宕机了,这个最后一次修改数据就没有了;
(2)fork进程的时候,会占用一定的内存空间。
2、 AOF策略
以日志的形式来记录每个写操作,将Redis执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,
redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
优点:
(1)每一次修改都同步,文件的完整会更加好;
(2)每次同步一次,可能会丢失一秒的数据;
(3)从不同步,那么效率最高!
缺点:
(1)相对于数据文件来说,aof远远大于rdb,修复的速度也比rdb慢;
(2)aof运行效率也要比rdb慢,所有我们redis默认的配置就是rdb持久化。
3️⃣内存的配置
指定Redis的最大内存限制,Redis在启动的时候会把数据加载到内存里,达到最大内存,redis会现尝试清除已经到期的或即将到期的
- maxednonly no
- appendfileName ,appendly ,id
⑦ Redis内存维护策略
redis作为一款优秀的中间件,时常会存储大量的数据,即使使用了集群的部署方式来动态扩展,也应该及时的整理内存,维护系统的性能。
在redis中有两种解决方式
① 为数据设置过期时间
设置过期时间
expire key time(以秒的单位)--这是最常用的方式
setex(String key,int second,String value) -- 字符串独有的方法
- 除了字符串自己独有的设置过期时间的方式外,其他方式都需要依靠expire方法来实现
- 如果没有设置时间,那就缓存就永远不会过期
- 如果设置了过期时间,之后又想让缓存永不过期,使用persist key
② 采用LRU算法动态的将不用的数据删除
内存管理的一种方式,对于在内存中但又不用的数据块,进行清除
- volatile-lru:设置超时时间的数据的算法,删除是最不常用的数据
allkeys-lru:查询所有的key中最近不常用的数据进行删除,这是应用最广泛的策略
- volatile-random:在已经设置了超时时间的key中随机删除
- allkeys-random:在所有的key中随机删除
- noeviction:如果设置为该属性,则不会删除数据
- volatile-ttl:从所有的配置了过期时间的建中驱逐使用频率最少的键
- allkeys-lfu:从所有的建中驱逐使用频率最少的键
⑧ Redis配置修改
- 修改deamonize 为yes 开启守护线程方式启动redis
- bind 127.0.0.1 加上bind 192.168.188.129 添加本机的ip地址 允许其他ip也能访问本机的redis服务
1.4.3 Redis启动
① 后台启动redis服务端
-- 后台启动redis服务端
redis-server /opt/redis-5.0.14/redis.conf
② 启动客户端
启动客户端的的方式有很多种
- 第一种就是
redis-cli -h --后台默认127.0.0.1启动
- 第二种就是指定端口号和ip地址以及密码进行登录
redis-cli -h ip地址 -p 端口号 -a 密码
redis-cli -h 192.168.188.129
没有密码就不需要写-a 密码 ,端口如果没有修改也可以不写
查看redis进程
ps -ef | grep redis
1.4.4 Redis的关闭
① 非正常关闭
先使用ps -ef 继续查看redis的后台进程号,在使用kill -9 进程号来进行关闭redis的服务
注意:但是不建议这样操作。可能会导致reids的数据丢失
ps - ef | grep redis
kill -9 进程号
这种方式相当于是断电操作。如果涉及数据业务的问题,谨慎操作
② 正常关闭🔥🔥
shudown命令来进行正常的关闭
192.168.188.129:6379> SHUTDOWN
注意:这样的操作会让redis进行数据的持久化操作。把reids再关闭前的数据进行持久化到dump.rdb文件下(使用rdb的持久化策略)
1.4.5 Redis的外部连接以及GUI图形化工具的使用
Redis作为一个数据库,也是有他的图形化工具的,虽然我不建议一开始初学就使用,但是为了后期Java操作时方便查看,我们在这里先装上。
目前市面上比较火的redis的GUI工具有两款是我比较推荐的
- redis官方提供的redis-desktop-manager,这款工具2018年后开始收费了,网上有许多破解版可以使用
参考:https://www.jb51.net/softjc/733990.html - anthor-redis-desktop 这个我没用过,有了解的可以自行搜索下载
下载安装好后,我们需要使用GUI进行连接Reids,这时候,发现连接不上:question:
原因:虚拟机没有开启防火墙,以及redis的端口号没有被放行
解决外部无法连接虚拟机的redis🔥🔥🔥
- 首先检查redis的配置是否把bind注释掉,或者直接添加需要访问的主机ip
- 检查linux防火墙是否关闭
- 检查redis的端口6379是否被放行
firewall-cmd --list-ports
如果发现未开启6379端口号,需要添加如下的命令开启6379端口号
firewall-cmd --zone=public --add-port=6379/tcp --paramanent
修改完毕后,再次链接GUI客户端,发现操作成功
二、Redis命令
Redis命令用于在redis服务上执行操作,需要在redis服务上执行的操作。
Redis支持的五种数据类型:String(字符串)、hash(哈希)、list(列表)、set(集合)及zset(sorted set):有序集合等
2.1常用命令Key的管理
- 测试redis是否连接:ping 命令用来侧手是否连接redis-返回pong则表示连接成功
192.168.188.129:6379> ping
PONG
- clear :清空控制台,方便查看
- flushall:清空redis的数据
- move key 数据库名称 :将当前的数据库中的键移动到指定的数据库下
192.168.188.129:6379> move name 2
(integer) 1
-
keys *: 表示
查询当前数据库下所有的key,支持模糊通配
-
exists key: 表示查询当前数据库下指定的key是否存在,
支持一次性判断多个键是否存在,返回存在的键的个数
- 0 :表示不存在
- 1:表示存在
-
**ttl key:**查看指定键的失效时间
- -2:表示失效
- -1:表示永不失效
- 某个正数:剩余时间(秒)
192.168.188.129:6379> keys *
1) "students"
2) "score"
3) "letters"
4) "user"
5) "users"
6) "code"
192.168.188.129:6379> keys u*
1) "user"
2) "users"
192.168.188.129:6379> EXISTS name
(integer) 0
192.168.188.129:6379> EXISTS code
(integer) 1
192.168.188.129:6379> EXISTS code name
(integer) 1
192.168.188.129:6379> EXISTS name user code
(integer) 2
192.168.188.129:6379> ttl code
(integer) -1
192.168.188.129:6379>
- 删除某个指定的key
192.168.188.129:6379> set name hei
OK
192.168.188.129:6379> keys *
1) "students"
2) "score"
3) "letters"
4) "name"
5) "user"
6) "users"
7) "code"
192.168.188.129:6379> del name
(integer) 1
192.168.188.129:6379> keys *
1) "students"
2) "score"
3) "letters"
4) "user"
5) "users"
6) "code"
192.168.188.129:6379>
- type 键名:查看数据类型
192.168.188.129:6379> type name
string
2.2 应用场景
EXPIRE key seconds
- 限时的优惠活动
- 网站的数据缓存(对于一些热点的数据)
- 手机验证码
- 限制网站访问的次数频率(例如:1分钟最多访问10次)
2.3 Key的命名建议
redis种单个的key允许存入512MB大小
- key不要太长,尽量不要超过1024个字节,这不仅消耗内存,而且会降低查询的效率
- key也不要太短,太短的话,key的可读性会降低
- 在一个项目中,key最好使用统一的命名模式,例如user:123:password;
- key名称区分大小写
三、Redis数据类型
3.1 String类型
① 简介
String类型是Redis里最常见的数据类型,也是最基本的数据类型
String数据结构是非常简单的,value岂不仅是String,也可以是数字,是包含许多种类型的特殊类型。
String类型是二进制安全的,意思是redis的String可以包含任意数据
比如序列化的对象进行存储,比如一张图片进行二进制存储,比如一个简单的字符串,数字等等进行存储。
② String命令
赋值语法
赋值语法:
set key_namevalue:(说明,多次设置name会被覆盖)(redis set命令用于设置给定 key 的值,
如果key 已经存在则会重写掉原先的数据)
命令:
1️⃣setnx key1 value:
(not exist) 如果key1不存在,则设置 并返回结果1 ,如果key1存在,则会设置值并返回结果0(解决分布式锁 方案之一,只有在不能存在的时候设置key的值。)setnx(set if not exists) 命令在指定的key不存在时,为key赋值
2️⃣**setrange key_name offset value:
**用于替换掉指定key中的某个值
192.168.188.129:6379> keys *
1) "letters"
2) "users"
3) "score"
4) "user"
5) "code"
6) "students"
192.168.188.129:6379> set name admin
OK
192.168.188.129:6379> set name test
OK
192.168.188.129:6379> get name
"test"
192.168.188.129:6379> setnx name te
(integer) 0
192.168.188.129:6379> set name1 te
OK
192.168.188.129:6379> get code
"02DF"
192.168.188.129:6379> SETRANGE code 2 1
(integer) 4
192.168.188.129:6379> get code
"021F"
192.168.188.129:6379>
取值语法
取值语法:
get key_name:
redis get命令用于获取指定的key的值,如果key不存在,返回nil,如果key存储的不是字符传,则返回错误。
GETRANGE key start end
用于获取存储在指定的key中的字符串的子字符串。字符串的截取范围由start和end两个偏移量决定(包括satrt和end在内
)
GETBIT key offset
对于所存储的字符串的值,获取指定的偏移量的位bit
GETSET key_name value
getset 命令用于指定key的值,并返回key的旧值,当key不存在的时候,返回nil
strlen key
获取字符串的长度
192.168.188.129:6379> get score
(error) WRONGTYPE Operation against a key holding the wrong kind of value
192.168.188.129:6379> type score
zset
192.168.188.129:6379> GETRANGE code 0 -1
"021F"
192.168.188.129:6379> GETRANGE code 0 2
"021"
192.168.188.129:6379> STRLEN code
(integer) 4
192.168.188.129:6379> get code
"021F"
192.168.188.129:6379> GETSET code 02SD
"021F"
192.168.188.129:6379>
删值语法
DEL key_name
删除指定的key,如果存在,则返回数字类型
del这种删除是redis中删除任意数据类型的数据
批量操纵
批量写 MSET k1 v1 k2 v2 k3 v3 ...
一次性写入多个key_value
批量读 MGET k1 k2 k3
批量删除del k1 k2 ...
192.168.188.129:6379> mset name1 zs name2 li name3 ww
OK
192.168.188.129:6379> MGET name1 name2 name3
1) "zs"
2) "li"
3) "ww"
192.168.188.129:6379> del name1 name2 name3
(integer) 3
高级操作
① 自增 incrby|incr
② 自减 decrby|decr
192.168.188.129:6379> set num 1
OK
192.168.188.129:6379> INCR num
(integer) 2
192.168.188.129:6379> INCRBY num 10
(integer) 12
192.168.188.129:6379> DECR num
(integer) 11
192.168.188.129:6379> DECRBY num 10
(integer) 1
192.168.188.129:6379>
注意: 在执行incr|decr或者incrby|decrby的命令时,只能针对值是数字类型的String数据,否则报错
③ 字符串的追加 append
192.168.188.129:6379> APPEND code 111
(integer) 7
192.168.188.129:6379> get code
"02SD111"
192.168.188.129:6379>
③ String的应用场景
- 1.String通常用于保存单个字符串或者时JSON字符串数据
- 2.因String是二进制安全的,所以完全可以把一个图片文件的内容存储进来
- 3.计数器(常规的key-value缓存的应用,常规技术:微博数,粉丝数)
redis的incr|decr等每个的那个命令都是原子性的,保证了安全性,而且不会上锁提高了效率
3.2 Hash类型
② Hash命令
赋值语法
赋值语法:
1️⃣hset key field value:
为指定的key设定fild/value
2️⃣hmset key fild value [fild value]
同时将多个 filed value设置到哈希表中。
取值语法
取值语法:
hget key field
获取村粗在hset里面的值,根据field得到value。
hmget key field [field]
获取key所有给定字段的值
hgetAll key
返回指定hash中所有的字段的值
hkeys key
获取所有hash表中的字段
hlen key
获取哈希表中字段的数量
192.168.188.129:6379> hset students1 name zs age 21 gender 1
(integer) 3
192.168.188.129:6379> HGET students1 name
"zs"
192.168.188.129:6379> HLEN students1
(integer) 3
192.168.188.129:6379> HMGET students1 name age gender
1) "zs"
2) "21"
3) "1"
192.168.188.129:6379> HKEYS *
(empty list or set)
192.168.188.129:6379> hkeys students1
1) "name"
2) "age"
3) "gender"
192.168.188.129:6379> HGETALL students1
1) "name"
2) "zs"
3) "age"
4) "21"
5) "gender"
6) "1"
192.168.188.129:6379>
删值语法
DEL key_name
删除指定的key,如果存在,则返回数字类型
HDEL key_name field
删除指定的key中的指定field字段的value,如果存在,则返回数字类型
del这种删除是redis中删除任意数据类型的数据
高级操作
① 自增 hincrby key field incrment
② 设置不存在的值 hsetnx key field value 只有字段不存在的时候,才会设置哈希值
192.168.188.129:6379> HINCRBY students1 age 1
(integer) 22
192.168.188.129:6379> HEXISTS students1 name
(integer) 1
192.168.188.129:6379> HEXISTS students1 names
(integer) 0
192.168.188.129:6379>
③ 设置自增浮点数
hincrbyfloat key field increment 为hash表中key中指定某一个field的浮点值加上increment的浮点数
④ hexists key field:
查看hash表中key 中,指定的字段是否存在
③ Hash的应用场景
- 1.常用于存储一个对象/分布式session
- 2.为什么不用String存储一个对象 ❓
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中- 一个对象转换成hashmap存放在redis中。
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key /value结构来存储,主要有以下2种存储方式:
第一种方式
将用户ID作为查找key ,把其他信息封装成一个对象以序列化的方式存储,
这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,
需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等 复杂问题。
第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,
用户ID+对应属性的名称作为唯一标识来取得对应属性的值,
虽然省去了序列化开销和并发问题,但是用户ID为重复存储,
如果存在大量这样的数据,内存浪费还是非常大的。
redis提供了hash很好的解决了这个问题,Redis的HASH实际上就是内部的存储的value为一个hashmap,并提供了直接存储这个Map的成员的接口。
3.3 List类型
List是一个链表结构的集合,其主要的功能有push,pop,获取元素等,更详细的说,List是一个双端列表的节点,我们可以通过相关的操作进行合的头部和尾部添加和删除数据。List的设计非常简单,即可以作为栈,也可以作为队列,满足大家的需求
按照插入的顺序排序,你可以添加一个元素的列表在头部或者尾部
② Hash常用命令
赋值语法
赋值语法:
1️⃣lpush key value1 [value2]:
将一个或者多个值插入到列表的头部【从走左往右添加】
2️⃣rpush key value1 [value2]:
将一个或者多个值插入到列表的尾部【从走右往左添加】
1️⃣lpushx key value1:
将一个值插入到列表的头部,如果列表不存在,则操作失败
2️⃣rpushx key value1:
将一个值插入到列表的尾部,如果列表不存在,则操作失败
lpush hobbies basketball football pingpong
(integer) 3
192.168.188.129:6379> LRANGE hobbies 0 -1
1) "pingpong"
2) "football"
3) "basketball"
192.168.188.129:6379> RPUSH like noodles rice fruit
(integer) 3
192.168.188.129:6379> LRANGE like 0 -1
1) "noodles"
2) "rice"
3) "fruit"
192.168.188.129:6379> LPUSHX like orange
(integer) 4
192.168.188.129:6379> LRANGE like 0 -1
1) "orange"
2) "noodles"
3) "rice"
4) "fruit"
192.168.188.129:6379> RPUSHX like apple
(integer) 5
192.168.188.129:6379> LRANGE like 0 -1
1) "orange"
2) "noodles"
3) "rice"
4) "fruit"
5) "apple"
192.168.188.129:6379>
取值语法
取值语法:
lrange key start end
获取指定键的从start下标开始到end下标结束
lindex key index
获取key指定下标的值
llen key
返回指定key中的列表的长度
192.168.188.129:6379> LINDEX like 3
"fruit"
192.168.188.129:6379> LINDEX like 5 -- 如果键不存在则返回nil
(nil)
192.168.188.129:6379> LLEN lkie
(integer) 0
192.168.188.129:6379> LLEN like
(integer) 5
192.168.188.129:6379>
说明:在redis里 涉及到下标的相关操作,既可以从0到某一个正数,也可以从-1到0
❓思考lrange命令可以应用于分页么
描述:lrange返回列表中指定区间的元素,start和end决定了这个范围
其中0表示列表中的第一个元素,1表示下一个,以此类推。
也可以是用复数作为下标,以-1作为开始,-2为下一个,以此类推。
start 页面大小(页数-1
)
end (页面大小*页数)-1
MySQL分页
语法格式:
limit [offset], rows
offset:偏移量 0
rows:返回的最大记录数,即每页的大小
每页的显示3条数据pageSize 当前页1页 currentPage
1页 0 3
2页 3 3
...
offset = (currentPage-1)*pageSize
rows = pageSize
Redis分页操作
list【类型】lrange语法格式
每页的显示3条数据pageSize 当前页1页 currentPage
1页 0 2
2页 3 5
...
start:(currentPage-1)*pageSize
end:(pageSize*currentPage)-1
--------------------------------------
192.168.188.129:6379> LRANGE like 0 2
1) "nihao"
2) "heiehi"
3) "orange"
192.168.188.129:6379> LRANGE like 3 5
1) "noodles"
2) "rice"
3) "fruit"
192.168.188.129:6379> LRANGE like 6 8
1) "apple"
192.168.188.129:6379>
删值语法
DEL key_name
删除指定的key,如果存在,则返回数字类型
lpop key
从左侧开始删除(弹出)一个元素,返回弹出的元素
rpop key
从右侧开始删除一个元素
ltrim key start end
对一个列表进行修剪
del这种删除是redis中删除任意数据类型的数据
修改语法
LSET key index value
修改指定的索引的值
LNSTR key Before|After world value
在列表的元素前或者后面插入元素,将值value插入到key当中,位于值world的前或者后。
高级操作
① rpoplpush source destination 从cource的list中 取出一个最后面的元素,捡起添加到destination列表中返回
3.4 Set类型
简介
Redis的Set类型是String类型的无序集合,集合成员是唯一的,而且是无序的
,这就是意味着集合中不能有重复的数据。Redis中集合是通过哈希表实现的,set是通过hashtable来实现的。
类似于Java中的HashTable集合
命令
赋值语法
赋值语法:
1️⃣sadd key numbers [numbers2]...:
向集合中添加一个或者多个的值
192.168.188.129:6379> SMEMBERS letters
1) "ddd"
2) "ccc"
192.168.188.129:6379> SADD s1 a b c d e f g
(integer) 7
取值语法
取值语法:
scard key
获取集合中的成员数
snumbers key
返回集合中的所有成员
sismember key number
判断number元素是否是集合中 key 中的成员,(在开发中,验证xx是否存在的判断
) 存在返回1 不存在返回1
srandmember key 【count】
返回集合中的一个或者多个随机数
192.168.188.129:6379> SCARD s1
(integer) 7
192.168.188.129:6379> SMEMBERS s1
1) "a"
2) "c"
3) "b"
4) "g"
5) "d"
6) "f"
7) "e"
192.168.188.129:6379> SISMEMBER s1 e
(integer) 1
192.168.188.129:6379> SISMEMBER s1 h
(integer) 0
192.168.188.129:6379> SRANDMEMBER s1
"b"
192.168.188.129:6379> SRANDMEMBER s1 3
1) "g"
2) "f"
3) "c"
192.168.188.129:6379>
删值语法
srem key member1 [member2]
移除一个或者多个set中的元素
spop key count
随机移除一个或者多个元素 很像实际业务中的抽奖 **
smove source destination memeber**
将一个set中的指定成员member移动到另一个set中
192.168.188.129:6379> SREM s1 a b c
(integer) 3
192.168.188.129:6379> SMEMBERS s1
1) "g"
2) "d"
3) "f"
4) "e"
----------------spop随机移除值----------------------------
192.168.188.129:6379> SPOP s1 2
1) "e"
2) "g"
--------------smove移动某个值到另一个set中-----------------
192.168.188.129:6379> SMEMBERS s1
1) "b"
2) "d"
3) "a"
4) "f"
5) "c"
192.168.188.129:6379> SMEMBERS s2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
192.168.188.129:6379> SMOVE s1 s2 a b
(error) ERR wrong number of arguments for 'smove' command
192.168.188.129:6379> SMOVE s1 s2 a
(integer) 1
192.168.188.129:6379> SMEMBERS s1
1) "b"
2) "d"
3) "f"
4) "c"
192.168.188.129:6379> SMEMBERS s2
1) "5"
2) "2"
3) "a"
4) "4"
5) "3"
6) "1"
192.168.188.129:6379>
布尔运算
差集语法
语法:
1、sdiff key1 [key2]
:返回指定集合key1中于key2集合的差集
2、sdiffstore destination key1 [key2]
:将key1 和key2 差集后的结果存储在一个destination新集合中
【集合key1中有,但是key2中没有的成员】
192.168.188.129:6379> SADD s1 a b c d
(integer) 4
192.168.188.129:6379> SADD s2 b d e f
(integer) 4
192.168.188.129:6379> SDIFF s1 s2
1) "a"
2) "c"
------------SDIFFSTORE差集处理后将结果存储在一个新集合中----------------
192.168.188.129:6379> SDIFFSTORE s3 s1 s2
(integer) 2
192.168.188.129:6379> SMEMBERS s3
1) "a"
2) "c"
192.168.188.129:6379>
并集语法
语法:
sunion key1 [key2] 返回指定集合key1,key2集合的所有元素的总和
sunionstore destination key1 ke2
【会去除掉重复的成员】
192.168.188.129:6379> SUNION s1 s2
1) "c"
2) "b"
3) "d"
4) "a"
5) "f"
6) "e"
192.168.188.129:6379>
交集语法
语法:
sinter key1 [key2] 返回指定集合key1,key2集合中公共的成员
sinterstore destination key1 key2
192.168.188.129:6379> SINTER s1 s2
1) "b"
2) "d"
192.168.188.129:6379>
3.5 ZSet类型
有序集合(Sorted set)
简介
- Redis有序集合和集合一样也是string类型元素的集合,且不必允许重复的值
- 不同的是每个元素都会关联一个doucle类型的分数score,redis正是通过这个score来进行排序的
- 有序集合的成员是唯一的,但分数score却是可以重复
- 集合是通过哈希表实现的。
Redis中的ZSet是有序,不重复的
命令
赋值语法
赋值语法:
1️⃣zadd key score1 numbers [ score2 numbers2]...:
向有序集合中添加一个或者多个的值
取值语法
取值语法:
scard key
获取集合中的成员数
scount key min max
计算有序集合中指定区间的集合数
zrank key member
返回有序集合中指定元素的索引
zrange key start stop [withscores]
通过索引区间返回有序集合指定区间内的成员(低到高)
zrangebyscore key min max [withscore] [limit]
通过分数返回有序集合指定区间内的成员
zreverrange key start stop [withscore]
返回有序集合中指定区间内的成员,通过索引、分数从高到低
zreverrangebyscore key max min [withscore]
返回有序集合中指定分数区间内的成员,分数由高到低排序
删值语法
del key
移除有序集合的一个或者多个成员
zrem key member [member2]...
移除有序集合中一个或者多个元素
zremrangebyscore key start stop
移除指定分数区间内所有的成员(下标从0开始)(低到高排序)