CentOS7-Redis常用五大数据类型

CentOS7-Redis常用五大数据类型

Redis键(key)

命令作用
key *查看当前库所有key
exists key判断某个key是否存在
type key查看key的类型
del key删除指定的key数据(直接删除)
unlink key根据 value选择非阻塞删除(异步删除),仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作
expire key 过期数值(秒)给定的key设置过期时间,单位:秒
ttl key查看key还有几秒过期,-1:永不过期,-2:已过期
select切换数据库
dbsize查看当前数据库的key的数量
flushdb清除当前库
flushall清除全部库

1、keys * 查看当前库中key的数量

1、使用客户端命令进入Redis
redis-cli

2、写值
set k1 v1
set k2 v2
set k3 v3

3、使用 keys * 查看当前库有多少个key
keys *

在这里插入图片描述

2、exists key 判断key是否存在

1、当前库中存在的key情况
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"

2、判断一个已经存在的key
127.0.0.1:6379> exists k3
(integer) 1


3、判断一个不存在的key
127.0.0.1:6379> exists k4
(integer) 0

3、type key 查看key的类型

1、当前库中存在的key情况
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"

2、查看 k2是什么类型
127.0.0.1:6379> type k2
string

4、del key 和 unlink key 删除key和value值

  • del key
1、当前库中存在的key情况
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"

2、删除指定的key数据:k2
127.0.0.1:6379> del k2
(integer) 1

3、查看当前库删除k2后的key数量
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
  • unlink key
1、当前库中存在的key情况
127.0.0.1:6379> keys *
1) "k1"
2) "k3"

2、删除指定的key数据:k1
127.0.0.1:6379> unlink k1
(integer) 1

3、查看当前库删除k1后的key数量
127.0.0.1:6379> keys *
1) "k3"

5、expire key 过期数值(秒)和 ttl key 设置key过期时间和查看过期时间

1、当前库中存在的key情况
127.0.0.1:6379> keys *
1) "k3"

2、设置 k3 十秒后过期
127.0.0.1:6379> expire k3 10
(integer) 1

3、查看过期时间
127.0.0.1:6379> ttl k3
(integer) 6
127.0.0.1:6379> ttl k3
(integer) 4
127.0.0.1:6379> ttl k3
(integer) 2
127.0.0.1:6379> ttl k3
(integer) -2 (-2表示:已过期;-1表示:永不过期)

4、新加的key,默认是-1表示:永不过期
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1

6、select 切换数据库

1、Redis中默认有16个库(0-15)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 15
OK
127.0.0.1:6379[15]> select 11
OK
127.0.0.1:6379[11]> select 16
(error) ERR DB index is out of range
127.0.0.1:6379[11]> select 0
OK
127.0.0.1:6379>

在这里插入图片描述

7、dbsize 查看当前数据库的key数量

1、当前库中存在的key情况
127.0.0.1:6379> keys *
1) "k1"

2、查看当前数据库的key数量
127.0.0.1:6379> dbsize
(integer) 1

8、flushdb 清空当前库

1、当前库中存在的key情况
127.0.0.1:6379> keys *
1) "k1"

2、清空当前库的数据
127.0.0.1:6379> flushdb
OK

3、再次查看当前库中的key情况
127.0.0.1:6379> keys *
(empty array)

1、Redis 字符串(String)

1、简介

  • 是 Redis 中最简单的数据类型
  • 一个 key 对应一个 value
  • 二进制安全的可以包含任何数据,如:JPG图片、序列化的对象等等
  • 一个Redis字符串value最多可以是512M

2、常用命令

命令作用
set <key><value>设定指定键的值
setnx <key><value>当key不存在时,才设置key的值
mset <key1><value1><key2><value2>…一次写入多个key和value
msetnx<key1><value1><key2><value2>一次写入多个key和value(只有当设置的所有key中,在当前库中不存在,才能写入成功;)
get <key>获取指定键的值
mget<key1><key2>…一次获取多个key的值
append<key><value>将值追加到指定key中原值的末尾
strlen <key>获取key中value的长度
incr <key>给key的value值加1(incr 只能对数字值操作)
decr <key>给key的value值减1(decr 只能对数字值操作)
incrby <key> <步长>给key的value值加指定步长,(incrby 只能对数字值操作)
decrby <key> <步长>给key的value值减指定步长,(decrby 只能对数字值操作)
getrange<key><起始位置><结束位置>获取值的范围
setrange<key><起始位置><value>指定位置插入数据(会覆盖原数据)
setex<key><过期时间><value>设置键值的同时,设置过期时间(单位:秒)
getset<key><value>设置新值同时获取旧值
1、set <key><value> 和 get <key>命令
1、当前库中key的情况
127.0.0.1:6379> keys *
(empty array)

2、添加key
127.0.0.1:6379> set k1 v100
OK
127.0.0.1:6379> set k2 v200
OK

3、查看当前库中key的情况
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

4、获取指定key的值
127.0.0.1:6379> get k1
"v100"
  • 设置已存在key的值
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

2、当前 k1的值
127.0.0.1:6379> get k1
"v100"

3、设置 k1的值
127.0.0.1:6379> set k1 v1100
OK

4、查看设置后,k1的值(原来的值v100被后来设置的v1100给覆盖了)
127.0.0.1:6379> get k1
"v1100"
2、 append<key><value>
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

2、当前 k1的值
127.0.0.1:6379> get k1
"v1100"

3、将hell追加的 k1中原值v1100的末尾,成功后打印新value的长度10
127.0.0.1:6379> append k1 hello
(integer) 10

4、查看追加后的结果
127.0.0.1:6379> get k1
"v1100hello"
3、strlen <key> 获取key中value的长度
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

2、当前 k1的值
127.0.0.1:6379> get k1
"v1100hello"

3、获取k1中value值的长度
127.0.0.1:6379> strlen k1
(integer) 10
4、setnx <key><value> 当key不存在时,才设置key的值
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

2、当前 k1的值
127.0.0.1:6379> get k1
"v1100hello"

3、设置一个已经存在key的值(设置失败)
127.0.0.1:6379> setnx k1 123
(integer) 0

4、设置一个不存在key的值(设置成功)
127.0.0.1:6379> setnx k3 v300
(integer) 1
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> get k3
"v300"
5、incr <key> 和 decr <key>命令
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"

2、新建一个k4,设置一个数值类型的值
127.0.0.1:6379> set k4 100
OK
127.0.0.1:6379> get k4
"100"

3、通过 incr k4 设置k4的值加一(incr 只能对数字值操作)
127.0.0.1:6379> incr k4
(integer) 101
127.0.0.1:6379> get k4
"101"

4、通过 decr k4 设置k4的值减一(decr 只能对数字值操作)
127.0.0.1:6379> decr k4
(integer) 100
127.0.0.1:6379> get k4
"100"
6、incrby <key> <步长> 和 decrby <key> <步长>
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "k1"
2) "k4"
3) "k3"
4) "k2"

2、当前 k4值
127.0.0.1:6379> get k4
"100"

3、通过 incrby k4 100 给k4的值加100
127.0.0.1:6379> incrby k4 100
(integer) 200
127.0.0.1:6379> get k4
"200"

4、通过 decrby k4 100 给k4的值减150
127.0.0.1:6379> decrby k4 150
(integer) 50
127.0.0.1:6379> get k4
"50"

原子性

  • Redis中的操作是 原子性操作,一旦开始不会其他线程调度机制打断(原子性
  • 在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,中断只能发生于指令之间
  • 在多线程中不能被其他进程(线程)打断的操作也可以认为是“原子操作
  • Redis单命令的原子性,得益于Redis的单线程
7、mset <key1><value1><key2><value2>… 、msetnx<key1><value1><key2><value2> 和 mget<key1><key2>…
1、当前库中key的情况
127.0.0.1:6379> keys *
(empty array)

2、使用 mset一次写入多个key和value
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

3、使用 msetnx 一次写入多个key(其中k3已经存在了)和value(写入失败)
-- 只有当设置的所有key中,在当前库中不存在,才能写入成功;
-- 只要在设置的所有key中,在当前库中已经存在,其余不重复的key也写入失败;
127.0.0.1:6379> msetnx k11 v11 k22 v22 k3 v3
(integer) 0

4、设置的所有key中,在当前库中不存在
127.0.0.1:6379> msetnx k11 v11 k22 v22 k33 v33
(integer) 1
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
4) "k11"
5) "k22"
6) "k33"

5、使用 mget 一次取多个key的值
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
8、getrange<key><起始位置><结束位置> 获取值的范围
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
4) "k11"
5) "k22"
6) "k33"

2、写入一个测试的值
127.0.0.1:6379> set name helloworld
OK

3、使用 getrange 获取 key是name 下标从 0-4五个下标的value值
127.0.0.1:6379> getrange name 0 4
"hello"
9、setrange<key><起始位置><value> 指定位置插入数据(会覆盖原数据)
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"helloworld"

2、在 hello的后面插入 123,使用setrange(插入的数据会覆盖原来的数据)
127.0.0.1:6379> setrange name 5 123
(integer) 10
127.0.0.1:6379> get name
"hello123ld"
10 、setex<key><过期时间><value> 设置键值的同时,设置过期时间(单位:秒)
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "name"

2、设置一个 color的key,过期时间是:10秒,value值是:skyblue
127.0.0.1:6379> setex color 10 skyblue
OK
127.0.0.1:6379> ttl color
(integer) 8
127.0.0.1:6379> ttl color
(integer) 6
127.0.0.1:6379> ttl color
(integer) 5
127.0.0.1:6379> ttl color
(integer) 5
127.0.0.1:6379> ttl color
(integer) 3
127.0.0.1:6379> ttl color
(integer) 3
127.0.0.1:6379> ttl color
(integer) 1
127.0.0.1:6379> ttl color
(integer) 0
127.0.0.1:6379> ttl color
(integer) -2

3、当前库中key的情况
127.0.0.1:6379> keys *
1) "name"
11、getset<key><value> 设置新值同时获取旧值
1、当前库中key的情况
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"zhangsan"

2、设置 name的值为:lisi,打印name的旧值:zhangsan
127.0.0.1:6379> getset name lisi
"zhangsan"

3、获取name的值
127.0.0.1:6379> get name
"lisi"

3、数据结构

  • 简单动态字符串(缩写SDS)
  • 是可以修改的字符串
  • 内部结构实现上类似于Java中的ArrayList
  • 采用预分配冗余空间的方式来减少内存的频繁分配

在这里插入图片描述

  • 内部为当前字符串实际分配的空间 capacity
  • 一般要高于实际字符串长度 len
  • 当字符串长度<1M时,扩容都是加倍现有的空间
  • 当字符串长度>1M时,扩容时一次只会多扩1M的空间
  • 字符串长度最大为512M

2、Redis 列表(List)

1、简介

  • 相当于 Java 语言中的 LinkedList 结构是一个链表而非数组
  • Redis 列表的底层存储结构,是一个被称为快速链表(quicklist)的结构
  • 当列表中存储的元素较少时,Redis 会使用一块连续的内存来存储这些元素,这个连续的结构被称为 ziplist 压缩列表
  • 压缩列表是 Redis 为节省内存而开发的它是由一系列特殊编码的连续内存块组成的顺序型数据结构一个压缩列表可以包含任意多个节点每个节点都可以保存一个字符数组或者整数值
  • 当数据量较大时,Redis 列表就会是用 quicklist 快速链表存储元素
  • 采用了链表和压缩列表相结合的方式,也就是 quicklist + ziplist
  • 将多个 ziplist 使用双向指针串联起来,这样既能满足快速插入、删除的特性又节省了一部分存储空间

在这里插入图片描述

2、基础命令

命令作用
lppush <key><value1><value2>…从左写值
rpush<key><value1><value2>…从右写值
lrange <key><起始位置><结束位置>查看key中的元素,key 0 -1 表示查看当前key中所有元素
lpop左取值
rpop右取值
rpoplpush<key><key>从第一个key的右边取一个值,插入到第二个key的左边
lindex<key><index>按索引下标获取元素
llen<key>获取列表长度
linsert <key> before<value><newvalue>在key中的value之前插入一个新值newvalue
linsert <key> after<value><newvalue>在key中的value之后插入一个新值newvalue
lrem<key><n><value>从key中左边删除n个value(从左到右)
lset<key><index><value>将key中下标为index的值替换为 value
1、lppush <key><value1><value2>… 、rpush<key><value1><value2>… 和 lrange <key><起始位置><结束位置>
1、当前数据库中的key情况
127.0.0.1:6379> keys *
(empty array)

2、使用 lpush 从左写值
127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3

3、取值 0 -1 表示所有范围的值
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
  • 左写值
    在这里插入图片描述
1、使用 rpush 从右写值
127.0.0.1:6379> rpush k2 v1 v2 v3
(integer) 3

2、取值
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v2"
3) "v3"
  • 右写值
    在这里插入图片描述
2、lpop<key> 左取值 和 rpop<key>右取值
1、当前数据库中的key情况
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"

2、使用 lpop 从左取值
127.0.0.1:6379> lpop k1
"v3"
127.0.0.1:6379> lpop k1
"v2"
127.0.0.1:6379> keys * 
1) "k2"
2) "k1"

3、当 k1中的最后一个值被取出时,k2 就不存在了(值在键在,值无键无)
127.0.0.1:6379> lpop k1
"v1"
127.0.0.1:6379> keys * 
1) "k2"
1、当前数据库中的key情况
127.0.0.1:6379> keys * 
1) "k2"
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v2"
3) "v3"

2、右取值
127.0.0.1:6379> rpop k2 
"v3"

3、左取值
127.0.0.1:6379> lpop k2
"v1"

4、查看结果
127.0.0.1:6379> lrange k2 0 -1
1) "v2"
3、rpoplpush<右取值的key><放入key的左边>
1、左写值 k1
127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"

2、右写值 k2
127.0.0.1:6379> rpush k2 v11 v22 v33
(integer) 3
127.0.0.1:6379> lrange k2 0 -1
1) "v11"
2) "v22"
3) "v33"

3、使用 rpoplpush 从 k1的右边取一个值,放到k2的左边
127.0.0.1:6379> rpoplpush k1 k2
"v1"

4、查看结果
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v22"
4) "v33"
  • rpoplpush 右取值
    在这里插入图片描述
4、lindex<key><index>按索引下标获取元素
1、当前 k2中的值
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v22"
4) "v33"

2、按索引下标获取 k2的元素
127.0.0.1:6379> lindex k2 0
"v1"
127.0.0.1:6379> lindex k2 2
"v22"
127.0.0.1:6379> lindex k2 4 (超出索引)
(nil)
5、llen<key> 获取列表长度
1、当前 k2中的值
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v22"
4) "v33"

2、获取 k2列表的长度
127.0.0.1:6379> llen k2
(integer) 4
6、linsert <key> before<value><newvalue> 在…之前插入一个新值
  • before 在 … 之前
1、当前 k2中的元素
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v22"
4) "v33"

2、在 k2中的 v11 前新增一个 hello的值
127.0.0.1:6379> linsert k2 before "v11" "hello"
(integer) 5
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "hello"
3) "v11"
4) "v22"
5) "v33"

3、在 k2中的 v22 前新增一个 hello的值
127.0.0.1:6379> linsert k2 before "v22" "hello"
(integer) 6
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "hello"
3) "v11"
4) "hello"
5) "v22"
6) "v33"

4、在 k2中的 v33 前新增一个 hello的值
127.0.0.1:6379> linsert k2 before "v33" "hello"
(integer) 7
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "hello"
3) "v11"
4) "hello"
5) "v22"
6) "hello"
7) "v33"
  • after 在… 之后
1、当前 k1中的元素
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"

2、在 k2中的 v3 后面新增一个 hello的值
127.0.0.1:6379> linsert k1 after "v3" "hello"
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "hello"
3) "v2"
7、lrem<key><n><value> 从左边删除n个value(从左到右)
1、当前 k2中的元素
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "hello"
3) "v11"
4) "hello"
5) "v22"
6) "hello"
7) "v33"

2、在 k2中 从左往右删除2个 hello的值
127.0.0.1:6379> lrem k2 2 "hello"
(integer) 2

3、查看结果
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v22"
4) "hello"
5) "v33"
8、lset<key><index><value> 将key中下标为index的值替换为 value
1、当前 k2中的元素
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v22"
4) "hello"
5) "v33"


2、在 k2中将下标是0的“v1” 替换成 “helloworld”
127.0.0.1:6379> lset k2 0 helloworld
OK
127.0.0.1:6379> lrange k2 0 -1
1) "helloworld"
2) "v11"
3) "v22"
4) "hello"
5) "v33"

3、数据结构

  • Redis 列表的底层存储结构,是一个被称为快速链表(quicklist)的结构
  • 当列表中存储的元素较少时,Redis 会使用一块连续的内存来存储这些元素,这个连续的结构被称为 ziplist 压缩列表
  • 压缩列表是 Redis 为节省内存而开发的它是由一系列特殊编码的连续内存块组成的顺序型数据结构一个压缩列表可以包含任意多个节点每个节点都可以保存一个字符数组或者整数值
  • 当数据量较大时,Redis 列表就会是用 quicklist 快速链表存储元素
  • 采用了链表和压缩列表相结合的方式,也就是 quicklist + ziplist
  • 将多个 ziplist 使用双向指针串联起来,这样既能满足快速插入、删除的特性又节省了一部分存储空间
    在这里插入图片描述

3、Redis 集合(Set)

1、简介

  • 类似于list列表的功能
  • 可以自动去重(不存在重复的数据)
  • 是String类型的无序集合,底层是一个value为null的哈希表

2、常用命令

命令作用
sadd<key><value1><value2>…添加一个或多个值
smembers<key>取值
sismember<key><value>判断key中是否存在该value,有返回1,没有返回0
scardy<key>返回该集合的元素个数
spop<key>随机从该集合中吐出一个值
srandmember<key><n>随机从该集合中取出 n个值,但不会从集合中删除
smove<source><destination>value把集合中一个值从一个集合移动到另一个集合
sinter<key1><key2>返回两个集合的交集元素
sunion<key1><key2>返回两个集合的并集元素
sdiff<key1><key2>返回两个集合的差集元素(key1中存在,key2中不存在的元素)
1、sadd<key><value1><value2>… 添加一个或多个值 和 smembers<key>取值
1、一次新增多个值,其中 v2添加了两次
127.0.0.1:6379> sadd k1 v1 v2 v2 v3
(integer) 3

2、取值(使用 sadd 新增的值时,相同的值只取一个)
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"
2、sismember<key><value> 判断key中是否存在该value,有返回1,没有返回0
1、当前 k1中的元素
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"

2、判断 k1中是否存在 v2(存在返回 1127.0.0.1:6379> sismember k1 v2
(integer) 1

3、判断 k1中是否存在 v4(存在返回 0127.0.0.1:6379> sismember k1 v4
(integer) 0
3、scardy<key>返回该集合的元素个数
1、当前 k1中的元素
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"

2、返回 k1中的元素个数
127.0.0.1:6379> scard k1
(integer) 3
4、spop<key> 随机从该集合中吐出一个值
1、当前 k1中的元素
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"

2、随机从该集合中吐出一个值
127.0.0.1:6379> spop k1
"v1"
127.0.0.1:6379> spop k1
"v3"

3、再次查看 k1中的元素
127.0.0.1:6379> smembers k1
1) "v2"
5、srandmember<key><n> 随机从该集合中取出 n个值,但不会从集合中删除
1、当前 k1的元素
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v1"
4) "v3"
5) "v5"

2、随机从 k1中取出2个元素
127.0.0.1:6379> srandmember k1 2
1) "v3"
2) "v1"
127.0.0.1:6379> srandmember k1 2
1) "v4"
2) "v1"

3、再次查看 k1中的元素
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v1"
4) "v3"
5) "v5"
6、smove<source><destination>value 把集合中一个值从一个集合移动到另一个集合
1、当前 k1 k2中元素的情况
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v1"
4) "v3"
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v6"

2、将 k1中的 "v3"移动到 k2中
127.0.0.1:6379> smove k1 k2 v3
(integer) 1
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v6"
4) "v3"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v1"


3、将 k1中的 "v4"移动到 k2中(k2中已存在“v4”)
127.0.0.1:6379> smove k1 k2 v4
(integer) 1
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v6"
4) "v3"
7、sinter<key1><key2> 返回两个集合的交集元素
1、当前 k1 k2中元素的情况
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v3"

2、返回两个集合的交集元素
127.0.0.1:6379> sinter k1 k2
1) "v3"
8、sunion<key1><key2> 返回两个集合的并集元素
1、当前 k1 k2中元素的情况
127.0.0.1:6379> smembers k1
1) "v2"
2) "v1"
3) "v3"
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v3"

2、返回两个集合的并集元素
127.0.0.1:6379> sunion k1 k2
1) "v2"
2) "v1"
3) "v3"
4) "v5"
5) "v4"
9、sdiff<key1><key2> 返回两个集合的差集元素(key1中存在,key2中不存在的元素)
1、当前 k1 k2中元素的情况
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v1"
4) "v3"
127.0.0.1:6379> smembers k2
1) "v5"
2) "v4"
3) "v6"

2、以 k1为准,返回k2中不存在的元素
127.0.0.1:6379> sdiff k1 k2
1) "v2"
2) "v1"

3、数据结构

  • Set数据结构是dict字典通过哈希表实现
  • hash结构,所有的value都指向同一个内部值

4、Redis 哈希(Hash)

1、简介

  • 是一个键值对集合
  • 是一个String类型fieldvalue 的映射表,适合用于存储对象
  • 类似于Java中的Map<String,Object>

在这里插入图片描述

  • Hash采取的是第三种
    在这里插入图片描述

2、基本命令

命令作用
hset <key><field><value>给key集合中的field键赋值value
hget<key><field>取值
hmset<key1><field1><value1><field1><value1>…一次添加多个值
hkeys<key>列出key中所有的field
hvals<key>列出key中所有的value
hexists<key><field>查看哈希表key中,field是否存在
hincrby<key><field><increment>为key中field对应的值加上增量
hsetnx<key><field><value>当key中field不存在时,将field对应的值设置为 value
1、hset <key><field><value> 给key集合中的field键赋值value 和 hget<key><field>取值
1、写值
127.0.0.1:6379> hset user:001 name zhangsan
(integer) 1
127.0.0.1:6379> hset user:001 age 10
(integer) 1

2、通过 key 和 field键取值
127.0.0.1:6379> hget user:001 name
"zhangsan"
127.0.0.1:6379> hget user:001 age
"10"
2、hmset<key1><field1><value1><field1><value1>…一次添加多个值
1、一次添加多个值
127.0.0.1:6379> hmset user:002 name lisi age 30 shenggao 173
OK

2、取值
127.0.0.1:6379> hget user:002 name
"lisi"
127.0.0.1:6379> hget user:002 age
"30"
127.0.0.1:6379> hget user:002 shenggao
"173"
3、hkeys<key> 列出key中所有的field 和 hvals<key> 列出key中所有的value
1、列出key是user:002中所有的field
127.0.0.1:6379> hkeys user:002
1) "name"
2) "age"
3) "shenggao"

2、列出key是user:002中所有的value
127.0.0.1:6379> hvals user:002
1) "lisi"
2) "30"
3) "173"
4、hexists<key><field>查看哈希表key中,field是否存在
1、当前 key= user:002中所有的field
127.0.0.1:6379> hkeys user:002
1) "name"
2) "age"
3) "shenggao"

2、查看key= user:002中的field=“name”是否存在(存在返回1)
127.0.0.1:6379> hexists user:002 name
(integer) 1

3、查看key= user:002中的field=“tel”是否存在(不存在返回0)
127.0.0.1:6379> hexists user:002 tel
(integer) 0
5、hincrby<key><field><increment>为key中field对应的值加上增量
1、key=user:002中的field和value情况
127.0.0.1:6379> hkeys user:002
1) "name"
2) "age"
3) "shenggao"
127.0.0.1:6379> hvals user:002
1) "lisi"
2) "30"
3) "173"

2、给 key=user:002中field="age"对应的30加20
127.0.0.1:6379> hincrby user:002 age 20
(integer) 50
127.0.0.1:6379> hvals user:002
1) "lisi"
2) "50"
3) "173"

3、给 key=user:002中field="age"对应的50减20
127.0.0.1:6379> hincrby user:002 age -20
(integer) 30
127.0.0.1:6379> hvals user:002
1) "lisi"
2) "30"
3) "173"
6、hsetnx<key><field><value> 当key中field不存在时,将field对应的值设置为 value
1、key=user:002中的field和value情况
127.0.0.1:6379> hkeys user:002
1) "name"
2) "age"
3) "shenggao"
127.0.0.1:6379> hvals user:002
1) "lisi"
2) "30"
3) "173"

2、设置key=user:002中field=“name”对应的值为 “zhangsan”(field=“name”已经存在,设置失败)
127.0.0.1:6379> hsetnx user:002 name zhangsan
(integer) 0

3、设置key=user:002中field=“tel”对应的值为 “123456789”(field=“tel”不存在,设置成功)
127.0.0.1:6379> hsetnx user:002 tel 123456789
(integer) 1

4、查看结果
127.0.0.1:6379> hkeys user:002
1) "name"
2) "age"
3) "shenggao"
4) "tel"
127.0.0.1:6379> hvals user:002
1) "lisi"
2) "30"
3) "173"
4) "123456789"

3、数据结构

  • 对应的数据结构分别是:压缩列表(ziplist)和 哈希表(hashtable)
  • field-value长度较短且个数较少时,使用 压缩列表
  • field-value长度较长且个数较多时,使用 哈希表

5、Redis 有序集合(Zset)

1、简介

  • 有序集合,是一个没有重复元素的字符串集合
  • 有序集合中的每一个成员都关联了一个评分(score),用来按照从最低分到最高分的方式排序集合中的成员
  • 集合中的成员是唯一的,但评分是可以重复的

2、基本命令

命令作用
zadd<key><score1><value1><score2><value2>…一次写入多个值
zrange <key>查看值
zrangebyscore key minmax[withscores][limit offset count ]返回key中,所有score介于min和max之间(包括等于)的成员,从小到大排列
zrevrangebyscore key maxmin [withscores][limit offset count]返回key中,所有score介于max和min之间(包括等于)的成员,从大到小排列
zincrby<key><increment><value>为元素的score加上增量
zrem<key><value>删除该集合下,指定值的元素
zcount<key><min><max>统计该集合,分数区间内的元素个数
zrank<key><value>返回该value在集合中的排名,从0开始
1、zadd<key><score1><value1><score2><value2>… 一次写入多个值 和 zrange <key> 查看值
1、一次写入多个值
127.0.0.1:6379> zadd k1 100 java 200 c++ 300 phthon 400 c
(integer) 4

2、只查看值value
127.0.0.1:6379> zrange k1 0 -1
1) "java"
2) "c++"
3) "phthon"
4) "c"

3、查看值和评分 withscores(默认从小到大排序)
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "java"
2) "100"
3) "c++"
4) "200"
5) "phthon"
6) "300"
7) "c"
8) "400"
2、zrangebyscore key minmax[withscores][limit offset count ] 返回key中,所有score介于min和max之间(包括等于)的成员,从小到大排列
1、k1中的情况
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "java"
2) "100"
3) "c++"
4) "200"
5) "phthon"
6) "300"
7) "c"
8) "400"

2、查看 评分score在 200-300之间的成员
127.0.0.1:6379> zrangebyscore k1 200 300
1) "c++"
2) "phthon"

3、查询结果显示评分
127.0.0.1:6379> zrangebyscore k1 200 300 withscores
1) "c++"
2) "200"
3) "phthon"
4) "300"
3、zrevrangebyscore key maxmin [withscores][limit offset count]返回key中,所有score介于max和min之间(包括等于)的成员,从大到小排列
1、k1中的情况
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "java"
2) "100"
3) "c++"
4) "200"
5) "phthon"
6) "300"
7) "c"
8) "400"

2、查看 评分score在 400-200之间的成员
127.0.0.1:6379> zrevrangebyscore k1 400 200 
1) "c"
2) "phthon"
3) "c++"

3、查询结果显示评分
127.0.0.1:6379> zrevrangebyscore k1 400 200 withscores
1) "c"
2) "400"
3) "phthon"
4) "300"
5) "c++"
6) "200"
4、zincrby<key><increment><value> 为元素的score加上增量
1、k1中的情况
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "java"
2) "100"
3) "c++"
4) "200"
5) "phthon"
6) "300"
7) "c"
8) "400"

2、给 k1中的Java的score加上50的增量
127.0.0.1:6379> zincrby k1 50 java
"150"

3、查看结果
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "java"
2) "150"
3) "c++"
4) "200"
5) "phthon"
6) "300"
7) "c"
8) "400"
5、zrem<key><value> 删除该集合下,指定值的元素
1、k1中的情况
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "java"
2) "100"
3) "c++"
4) "200"
5) "phthon"
6) "300"
7) "c"
8) "400"

2、删除 
127.0.0.1:6379> zrem k1 java
(integer) 1

3、查看结果
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "c++"
2) "200"
3) "phthon"
4) "300"
5) "c"
6) "400"
6、zcount<key><min><max>统计该集合,分数区间内的元素个数
1、当前 k1中的情况
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "c++"
2) "200"
3) "phthon"
4) "300"
5) "c"
6) "400"

2、查看 k1中评分在 200-300之间的元素个数
127.0.0.1:6379> zcount k1 200 300
(integer) 2
7、zrank<key><value>返回该value在集合中的排名,从0开始
1、当前 k1中的情况
127.0.0.1:6379> zrange k1 0 -1 withscores
1) "c++"
2) "200"
3) "phthon"
4) "300"
5) "c"
6) "400"

2、查看value=“phthon”在k1中的排名(第1位)
127.0.0.1:6379> zrank k1 phthon
(integer) 1

3、数据结构

  • 类似于Java中的Map<String,Double>
  • 一方面可以给每个元素赋予一个权重score
  • 另一方面又类似于TreeSet内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表
  • Zset底层使用了两个数据结构:
  1. hash,作用是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到对应的score值
  2. 跳跃表,目的在于给元素value排序,根据score的范围获取元素列表

【尚硅谷】Redis 6 入门到精通 超详细 教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值