Redis数据库相关指令大合集

14天学习训练营导师课程: 郑为中《Vue和SpringBoot打造假日旅社管理系统》

努力是为了不平庸~
学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识点/题解/项目实操/遇到的bug/等等),在分享的同时加深对于知识点的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~
文章总结于课程学习以及部分总结

1 数据库操作指令

1.1.Redis中库说明

- 使用redis的默认配置器动redis服务后,默认会存在16个库,编号从0-15,默认使用第0个,
- 可以使用select 库的编号 来选择一个redis的库

- 默认使用DB 0 ,可以使用select n切换到DB n,dbsize可以查看当前数据库的大小,与key数量相关。

127.0.0.1:6379> SELECT 1   # 切换数据库
OK
127.0.0.1:6379[1]> 

1.2.Redis中操作库的指令

- select n 切换数据库
- dbsize可以查看当前数据库的大小

- 清空当前的库  FLUSHDB
- 清空全部的库  FLUSHALL

- keys * :查看当前数据库中所有的key。

- flushdb:清空当前数据库中的键值对。

- flushall:清空所有数据库的键值对。

1.3.redis客户端显示中文

$	./redis-cli  -p 7000 --raw

1.4.退出客户端

- exit

1.5.查看进程

$ ps -ef|grep redis
root      38504  32280  0 10:27 pts/1    00:00:00 ./redis-server *:6379
root      38714  38520  0 10:32 pts/2    00:00:00 grep --color=auto redis
127.0.0.1:6379> config get databases # 命令行查看数据库数量databases
1) "databases"
2) "16"

127.0.0.1:6379> select 8 # 切换数据库 DB 8
OK
127.0.0.1:6379[8]> dbsize # 查看数据库大小
(integer) 0

# 不同数据库之间 数据是不能互通的,并且dbsize 是根据库中key的个数。
127.0.0.1:6379> set name sakura 
OK
127.0.0.1:6379> SELECT 8
OK
127.0.0.1:6379[8]> get name # db8中并不能获取db0中的键值对。
(nil)
127.0.0.1:6379[8]> DBSIZE
(integer) 0
127.0.0.1:6379[8]> SELECT 0
OK
127.0.0.1:6379> keys *  # 查看所有的key
1) "counter:__rand_int__"
2) "mylist"
3) "name"
4) "key:__rand_int__"
5) "myset:__rand_int__"
127.0.0.1:6379> DBSIZE # size和key个数相关
(integer) 5

Redis是单线程的,Redis是基于内存操作的。 6.0以上支持多线程

所以Redis的性能瓶颈不是CPU,而是机器内存和网络带宽。所以就是用单线程了。

那么为什么Redis的速度如此快呢,性能这么高呢?QPS达到10W+

Redis为什么单线程还这么快?

  • 误区1:高性能的服务器一定是多线程的?
  • 误区2:多线程(CPU上下文会切换!)一定比单线程效率高!

核心:Redis是将所有的数据放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。

2 操作key相关指令

Redis-key

在redis中无论什么数据类型,在数据库中都是以key-value形式保存,通过进行对Redis-key的操作,来完成对数据库中数据的操作。

单点登录就可以将一些数据放在redis中,设置过期时间。

2.1.DEL指令

  • 语法 : DEL key [key …]
  • 作用 : 删除给定的一个或多个key 。不存在的key 会被忽略。
  • 可用版本: >= 1.0.0
  • 返回值: 被删除key 的数量。

2.2.EXISTS指令

  • 语法: EXISTS key
  • 作用: 检查给定key 是否存在。
  • 可用版本: >= 1.0.0
  • 返回值: 若key 存在,返回1 ,否则返回0。

2.3.EXPIRE

  • 语法: EXPIRE key seconds
  • 作用: 为给定key 设置生存时间,当key 过期时(生存时间为0 ),它会被自动删除。
  • 可用版本: >= 1.0.0
  • 时间复杂度: O(1)
  • 返回值:设置成功返回1 。

2.4.KEYS

  • 语法 : KEYS pattern
  • 作用 : 查找所有符合给定模式pattern 的key 。
  • 语法:
    KEYS * 匹配数据库中所有key 。
    KEYS h?llo 匹配hello ,hallo 和hxllo 等。
    KEYS h*llo 匹配hllo 和heeeeello 等。
    KEYS h[ae]llo 匹配hello 和hallo ,但不匹配hillo 。特殊符号用 “” 隔开
  • 可用版本: >= 1.0.0
  • 返回值: 符合给定模式的key 列表。

2.5.MOVE

  • 语法 : MOVE key db
  • 作用 : 将当前数据库的key 移动到给定的数据库db 当中。
  • 可用版本: >= 1.0.0
  • 返回值: 移动成功返回1 ,失败则返回0 。

2.6.PEXPIRE

  • 语法 : PEXPIRE key milliseconds
  • 作用 : 这个命令和EXPIRE 命令的作用类似,但是它以毫秒为单位设置key 的生存时间,而不像EXPIRE 命令那样,以秒为单位。
  • 可用版本: >= 2.6.0
  • 时间复杂度: O(1)
  • 返回值:设置成功,返回1 key 不存在或设置失败,返回0

2.7.PEXPIREAT

  • 语法 : PEXPIREAT key milliseconds-timestamp
  • 作用 : 这个命令和EXPIREAT 命令类似,但它以毫秒为单位设置key 的过期unix 时间戳,而不是像EXPIREAT那样,以秒为单位。
  • 可用版本: >= 2.6.0
  • 返回值:如果生存时间设置成功,返回1 。当key 不存在或没办法设置生存时间时,返回0 。(查看EXPIRE 命令获取更多信息)

2.8.TTL

  • 语法 : TTL key
  • 作用 : 以秒为单位,返回给定key 的剩余生存时间(TTL,time to live)。
  • 可用版本: >= 1.0.0
  • 返回值:
    当key 不存在时,返回-2 。
    当key 存在但没有设置剩余生存时间时,返回-1 。
    否则,以秒为单位,返回key 的剩余生存时间。
  • Note : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。

2.9.PTTL

  • 语法 : PTTL key
  • 作用 : 这个命令类似于TTL 命令,但它以毫秒为单位返回key 的剩余生存时间,而不是像TTL 命令那样,以秒为单位。
  • 可用版本: >= 2.6.0
  • 返回值: 当key 不存在时,返回-2 。当key 存在但没有设置剩余生存时间时,返回-1 。
  • 否则,以毫秒为单位,返回key 的剩余生存时间。
  • 注意 : 在Redis 2.8 以前,当key 不存在,或者key 没有设置剩余生存时间时,命令都返回-1 。

2.10.RANDOMKEY

  • 语法 : RANDOMKEY
  • 作用 : 从当前数据库中随机返回(不删除) 一个key 。
  • 可用版本: >= 1.0.0
  • 返回值:当数据库不为空时,返回一个key 。当数据库为空时,返回nil 。

2.11.RENAME

  • 语法 : RENAME key newkey
  • 作用 : 将key 改名为newkey 。当key 和newkey 相同,或者key 不存在时,返回一个错误。当newkey 已经存在时,RENAME 命令将覆盖旧值。
  • 可用版本: >= 1.0.0
  • 返回值: 改名成功时提示OK ,失败时候返回一个错误。

2.12.TYPE

  • 语法 : TYPE key
  • 作用 : 返回key 所储存的值的类型。
  • 可用版本: >= 1.0.0
  • 返回值:
    none (key 不存在)
    string (字符串)
    list (列表)
    set (集合)
    zset (有序集)
    hash (哈希表)
127.0.0.1:6379> keys * # 查看所有的
key (empty list or set) 
127.0.0.1:6379> set name kuangshen # set key 
OK
127.0.0.1:6379> keys * 
1) "name" 
127.0.0.1:6379> set age 1 
OK
127.0.0.1:6379> keys * 
1) "age" 
2) "name" 
127.0.0.1:6379> EXISTS name # 判断当前的key是否存在 
(integer) 1 
127.0.0.1:6379> EXISTS name1 
(integer) 0 
127.0.0.1:6379> move name 1 # 将当前的key移动到数据库1中
(integer) 1 
127.0.0.1:6379> keys * 
1) "age" 
127.0.0.1:6379> set name qinjiang 
OK
127.0.0.1:6379> keys * 
1) "age" 
2) "name" 
127.0.0.1:6379> clear 
127.0.0.1:6379> keys * 
1) "age" 
2) "name" 
127.0.0.1:6379> get name 
"qinjiang" 
127.0.0.1:6379> EXPIRE name 10 # 设置key的过期时间,单位是秒 
(integer) 1 
127.0.0.1:6379> ttl name # 查看当前key的剩余时间 
(integer) 4 
127.0.0.1:6379> ttl name 
(integer) 3 
127.0.0.1:6379> ttl name 
(integer) 2 
127.0.0.1:6379> ttl name 
(integer) 1 
127.0.0.1:6379> ttl name 
(integer) -2 
127.0.0.1:6379> get name 
(nil) 
127.0.0.1:6379> type name # 查看当前key的一个类型! 
string 
127.0.0.1:6379> type age 
string

3 String类型

3.1. 内存存储模型

在这里插入图片描述

3.2. 常用操作命令

命令 说明
set 设置一个key/value
get 根据key获得对应的value
mset 一次设置多个key value
mget 一次获得多个key的value
getset 获得原始key的值,同时设置新值
strlen 获得对应key存储value的长度
append 为对应key的value追加内容
getrange 索引0开始 截取value的内容
setex 设置一个key存活的有效期(秒)
psetex 设置一个key存活的有效期(毫秒)
setnx 存在不做任何操作,不存在添加
msetnx原子操作(只要有一个存在不做任何操作) 可以同时设置多个key,只有有一个存在都不保存
decr 进行数值类型的-1操作
decrby 根据提供的数据进行减法操作
Incr 进行数值类型的+1操作
incrby 根据提供的数据进行加法操作
Incrbyfloat 根据提供的数据加入浮点数
###################################################################
127.0.0.1:6379> set key1 v1	# 设置值
OK
127.0.0.1:6379> get key1	# 获得值
"v1"
127.0.0.1:6379> keys *	# 获得所有的key
1) "key1"
127.0.0.1:6379> EXISTS key1	# 判断某一个key是否存在
(integer) 1
127.0.0.1:6379> APPEND key1 "hello"	# 追加字符串,如果当前key不存在,就相当于setkey 
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> STRLEN key1	# 获取字符串的长度!
(integer) 7
127.0.0.1:6379> APPEND key1 ",kaungshen" 
(integer) 17
127.0.0.1:6379> STRLEN key1
(integer) 17
127.0.0.1:6379> get key1
"v1hello,kaungshen" 

################################################################### # i++
# 步 长 i+=
127.0.0.1:6379> set views 0	# 初始浏览量为0 OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views	# 自增1	浏览量变为1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views	# 自减1	浏览量-1 
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> INCRBY views 10	# 可以设置步长,指定增量!
(integer) 9
127.0.0.1:6379> INCRBY views 10
(integer) 19
127.0.0.1:6379> DECRBY views 5
(integer) 14

###################################################################
127.0.0.1:6379> FLUSHDB
# 字符串范围 range
127.0.0.1:6379> set key1 "hello,kuangshen" # 设置 key1 的值
OK
127.0.0.1:6379> get key1
"hello,kuangshen"
127.0.0.1:6379> GETRANGE key1 0 3	# 截取字符串 [0,3]
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1	# 获取全部的字符串 和 get key是一样的
"hello,kuangshen"

# 替换!
127.0.0.1:6379> set key2 abcdefg 
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 xx	# 替换指定位置开始的字符串!
(integer) 7
127.0.0.1:6379> get key2
"axxdefg" 

###################################################################
# setex (set with expire)	# 设置过期时间
# setnx (set if not exist)	# 不存在再设置 (在分布式锁中会常常使用!) 
127.0.0.1:6379> setex key3 30 "hello" # 设置key3 的值为 hello,30秒后过期OK
127.0.0.1:6379> ttl key3
(integer) 26
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis"	# 如果mykey 不存在,创建mykey 
(integer) 1
127.0.0.1:6379> keys *
1)"key2"
2)"mykey"
3)"key1" 
127.0.0.1:6379> ttl key3 
(integer) -2
127.0.0.1:6379> setnx mykey "MongoDB"	# 如果mykey存在,创建失败!
(integer) 0
127.0.0.1:6379> get mykey 
"redis"

###################################################################
mset
mget

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3	#	同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:6379> mget k1 k2 k3	#	同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4	# msetnx 是一个原子性的操作,要么一起成功,要么一起失败!
(integer) 0
127.0.0.1:6379> get k4
(nil)

# 对象
127.0.0.1:6379> set user:1 {name:zhangsan,age:3}	
# 设置一个user:1 对象 值为 json字符来保存一个对象! 
# 这里的key是一个巧妙的设计: user:{id}:{filed},如此设计在Redis中是完全OK了!
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2 
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan" 
2) "2"

###################################################################
getset # 先get然后在set

127.0.0.1:6379> getset db redis	# 如果不存在值,则返回 nil 
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb	# 如果存在值,获取原来的值,并设置新的值
"redis" 
127.0.0.1:6379> get db
"mongodb"

数据结构是相同的!

String类似的使用场景:value除了是我们的字符串还可以是我们的数字!

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储
命令 描述 示例
APPEND key value 向指定的key的value后追加字符串 127.0.0.1:6379> set msg hello OK 127.0.0.1:6379> append msg " world" (integer) 11 127.0.0.1:6379> get msg “hello world”
DECR/INCR key 将指定key的value数值进行+1/-1(仅对于数字) 127.0.0.1:6379> set age 20 OK 127.0.0.1:6379> incr age (integer) 21 127.0.0.1:6379> decr age (integer) 20
INCRBY/DECRBY key n 按指定的步长对数值进行加减 127.0.0.1:6379> INCRBY age 5 (integer) 25 127.0.0.1:6379> DECRBY age 10 (integer) 15
INCRBYFLOAT key n 为数值加上浮点型数值 127.0.0.1:6379> INCRBYFLOAT age 5.2 “20.2”
STRLEN key 获取key保存值的字符串长度 127.0.0.1:6379> get msg “hello world” 127.0.0.1:6379> STRLEN msg (integer) 11
GETRANGE key start end 按起止位置获取字符串(闭区间,起止位置都取) 127.0.0.1:6379> get msg “hello world” 127.0.0.1:6379> GETRANGE msg 3 9 “lo worl”
SETRANGE key offset value 用指定的value 替换key中 offset开始的值 127.0.0.1:6379> SETRANGE msg 2 hello (integer) 7 127.0.0.1:6379> get msg “tehello”
GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 127.0.0.1:6379> GETSET msg test “hello world”
SETNX key value 仅当key不存在时进行set 127.0.0.1:6379> SETNX msg test (integer) 0 127.0.0.1:6379> SETNX name sakura (integer) 1
SETEX key seconds value set 键值对并设置过期时间 127.0.0.1:6379> setex name 10 root OK 127.0.0.1:6379> get name (nil)
MSET key1 value1 [key2 value2..] 批量set键值对 127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 OK
MSETNX key1 value1 [key2 value2..] 批量设置键值对,仅当参数中所有的key都不存在时执行 127.0.0.1:6379> MSETNX k1 v1 k4 v4 (integer) 0
MGET key1 [key2..] 批量获取多个key保存的值 127.0.0.1:6379> MGET k1 k2 k3 1) “v1” 2) “v2” 3) “v3”
PSETEX key milliseconds value 和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,
getset key value 如果不存在值,则返回nil,如果存在值,获取原来的值,并设置新的值

4 List类型

list 列表 相当于java中list 集合 特点 元素有序 且 可以重复。首先我们列表,可以经过规则定义将其变为队列、栈、双端队列等。

正如图Redis中List是可以进行双端操作的,所以命令也就分为了LXXX和RLLL两类,有时候L也表示List例如LLEN

4.1.内存存储模型

在这里插入图片描述

4.2.常用操作指令

命令 说明
lpush 将某个值加入到一个key列表头部
lpushx 同lpush,但是必须要保证这个key存在
rpush 将某个值加入到一个key列表末尾
rpushx 同rpush,但是必须要保证这个key存在
lpop 返回和移除列表左边的第一个元素
rpop 返回和移除列表右边的第一个元素
lrange 获取某一个下标区间内的元素
llen 获取列表元素个数
lset 设置某一个指定索引的值(索引必须存在)
lindex 获取某一个指定索引位置的元素
lrem 删除重复元素
ltrim 保留列表中特定区间内的元素
linsert 在某一个元素之前,之后插入新元素
###################################################################
127.0.0.1:6379> LPUSH list one	# 将一个值或者多个值,插入到列表头部(左)
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three 
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1	# 获取list中值!
1)"three"
2)"two"
3)"one"
127.0.0.1:6379> LRANGE list 0 1	# 通过区间获取具体的值!
1)"three"
2)"two"
127.0.0.1:6379> Rpush list right # 将一个值或者多个值,插入到列表位部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1)"three"
2)"two"
3)"one"
4)"right"

###################################################################
LPOP
RPOP
127.0.0.1:6379> LRANGE list 0 -1
1)"three"
2)"two"
3)"one"
4)"right"
127.0.0.1:6379> Lpop list	# 移除list的第一个元素
"three"
127.0.0.1:6379> Rpop list	# 移除list的最后一个元素
"right"
127.0.0.1:6379> LRANGE list 0 -1
1)"two"
2)"one" 

###################################################################
Lindex

127.0.0.1:6379> LRANGE list 0 -1
1)"two"
2)"one"
127.0.0.1:6379> lindex list 1	# 通过下标获得 list 中的某一个值!
"one"
127.0.0.1:6379> lindex list 0 "two"

###################################################################
Llen

127.0.0.1:6379> Lpush list one 
(integer) 1
127.0.0.1:6379> Lpush list two
(integer) 2
127.0.0.1:6379> Lpush list three 
(integer) 3
127.0.0.1:6379> Llen list	# 返回列表的长度
(integer) 3

###################################################################
#移除指定的值! 
#取关	uid

Lrem
127.0.0.1:6379> LRANGE list 0 -1
1)"three"
2)"three"
3)"two"
4)"one"
127.0.0.1:6379> lrem list 1 one	# 移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1)"three"
2)"three"
3)"two"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1)"three"
2)"two"
127.0.0.1:6379> Lpush list three 
(integer) 3
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "two"


###################################################################
trim 修剪、截断

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> Rpush mylist "hello" 
(integer) 1
127.0.0.1:6379> Rpush mylist "hello1" 
(integer) 2
127.0.0.1:6379> Rpush mylist "hello2" 
(integer) 3
127.0.0.1:6379> Rpush mylist "hello3" 
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2	# 通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素!
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1)"hello1"
2)"hello2"


###################################################################
rpoplpush # 移除列表的最后一个元素,将他移动到新的列表中!

127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1" 
(integer) 2
127.0.0.1:6379> rpush mylist "hello2" 
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist	# 移除列表的最后一个元素,将他移动到新的列表中!
"hello2"
127.0.0.1:6379> lrange mylist 0 -1 # 查看原来的列表
1)"hello"
2)"hello1"
127.0.0.1:6379> lrange myotherlist 0 -1	# 查看目标列表中,确实存在改值!
1) "hello2"


###################################################################
lset # 将列表中指定下标的值替换为另外一个值,更新操作

127.0.0.1:6379> EXISTS list	# 判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item	# 如果不存在列表我们去更新就会报错
(error) ERR no such key 
127.0.0.1:6379> lpush list value1 
(integer) 1
127.0.0.1:6379> LRANGE list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item	# 如果存在,更新当前下标的值
OK
127.0.0.1:6379> LRANGE list 0 0
1) "item"
127.0.0.1:6379> lset list 1 other	# 如果不存在,则会报错!
(error) ERR index out of range 


###################################################################
linsert # 将某个具体的value插入到列把你中某个元素的前面或者后面!

127.0.0.1:6379> Rpush mylist "hello" 
(integer) 1
127.0.0.1:6379> Rpush mylist "world" 
(integer) 2
127.0.0.1:6379> LINSERT mylist before "world" "other" 
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1)"hello"
2)"other"
3)"world"
127.0.0.1:6379> LINSERT mylist after world new 
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1)"hello"
2)"other"
3)"world"
4)"new"

小结

  • list实际上是一个链表,before Node after,left,right 都可以插入值
  • 如果key不存在,则创建新的链表
  • 如果key存在,新增内容
  • 如果移除了所有值,空链表,也代表不存在
  • 在两边插入或者改动值,效率最高!修改中间元素,效率相对较低

应用:

消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)

可做参考

命令 描述
LPUSH/RPUSH key value1[value2..] 从左边/右边向列表中PUSH值(一个或者多个)。
LRANGE key start end 获取list 起止元素==(索引从左往右 递增)==
LPUSHX/RPUSHX key value 向已存在的列名中push值(一个或者多个)
LINSERT key BEFOREAFTER pivot value 在指定列表元素的前/后 插入value
LLEN key 查看列表长度
LINDEX key index 通过索引获取列表元素
LSET key index value 通过索引为元素设值
LPOP/RPOP key 从最左边/最右边移除值 并返回
RPOPLPUSH source destination 将列表的尾部(右)最后一个值弹出,并返回,然后加到另一个列表的头部
LTRIM key start end 通过下标截取指定范围内的列表
LREM key count value List中是允许value重复的 count > 0:从头部开始搜索 然后删除指定的value 至多删除count个 count < 0:从尾部开始搜索… count = 0:删除列表中所有的指定value。
BLPOP/BRPOP key1[key2] timout 移出并获取列表的第一个/最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOPLPUSH source destination timeout RPOPLPUSH功能相同,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

5 Set类型

特点: Set类型 Set集合 元素无序 不可以重复

5.1.内存存储模型

在这里插入图片描述

5.2.常用命令

命令 说明
sadd 为集合添加元素
smembers 显示集合中所有元素 无序
scard 返回集合中元素的个数
spop 随机返回一个元素 并将元素在集合中删除
smove 从一个集合中向另一个集合移动元素 必须是同一种类型
srem 从集合中删除一个元素
sismember 判断一个集合中是否含有这个元素
srandmember 随机返回元素
sdiff 去掉第一个集合中其它集合含有的相同元素
sinter 求交集
sunion 求和集
###################################################################

# 以下三个可以写成 sadd myset hello kuangshen lovekuangshen
127.0.0.1:6379> sadd myset "hello"	# set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen" 
(integer) 1
127.0.0.1:6379> sadd myset "lovekuangshen" 
(integer) 1
127.0.0.1:6379> SMEMBERS myset	# 查看指定set的所有值
1)"hello"
2)"lovekuangshen"
3)"kuangshen"
127.0.0.1:6379> SISMEMBER myset hello	# 判断某一个值是不是在set集合中!
(integer) 1
127.0.0.1:6379> SISMEMBER myset world
(integer) 0


###################################################################
127.0.0.1:6379> scard myset	# 获取set集合中的内容元素个数!
(integer) 4


###################################################################
rem

127.0.0.1:6379> srem myset hello	# 移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1)"lovekuangshen2"
2)"lovekuangshen"
3)"kuangshen"


###################################################################
set # 无序不重复集合。抽随机!

127.0.0.1:6379> SMEMBERS myset
1)"lovekuangshen2"
2)"lovekuangshen"
3)"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset	# 随机抽选出一个元素
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset 2	# 随机抽选出指定个数的元素
1)"lovekuangshen"
2)"lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset 2
1)"lovekuangshen"
2)"lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset	# 随机抽选出一个元素
"lovekuangshen2"


###################################################################
# 删除定的key,随机删除key!

127.0.0.1:6379> SMEMBERS myset
1)"lovekuangshen2"
2)"lovekuangshen"
3)"kuangshen"
127.0.0.1:6379> spop myset	# 随机删除一些set集合中的元素!
"lovekuangshen2" 
127.0.0.1:6379> spop myset 
"lovekuangshen" 
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"


###################################################################
# 将一个指定的值,移动到另外一个set集合! 
127.0.0.1:6379> sadd myset "hello" 
(integer) 1
127.0.0.1:6379> sadd myset "world" 
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen" 
(integer) 1
127.0.0.1:6379> sadd myset2 "set2" 
(integer) 1
127.0.0.1:6379> smove myset myset2 "kuangshen" # 将一个指定的值,移动到另外一个set集合!
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1)"world"
2)"hello"
127.0.0.1:6379> SMEMBERS myset2
1)"kuangshen"
2)"set2"


###################################################################
(并集) 数字集合类:
-差集 SDIFF
-交集
-并集
127.0.0.1:6379> SDIFF key1 key2	# 差集
1) "b"
2) "a"
127.0.0.1:6379> SINTER key1 key2	# 交集	共同好友就可以这样实现
1) "c"
127.0.0.1:6379> SUNION key1 key2	# 并集
1) "b"
2) "c"
3) "e"
4) "a"
5) "d"
命令 描述
SADD key member1[member2..] 向集合中无序增加一个/多个成员
SCARD key 获取集合的成员数
SMEMBERS key 返回集合中所有的成员
SISMEMBER key member 查询member元素是否是集合的成员,结果是无序的
SRANDMEMBER key [count] 随机返回集合中count个成员,count缺省值为1
SPOP key [count] 随机移除并返回集合中count个成员,count缺省值为1
SMOVE source destination member 将source集合的成员member移动到destination集合
SREM key member1[member2..] 移除集合中一个/多个成员
SDIFF key1[key2..] 返回所有集合的差集 key1- key2 - …
SDIFFSTORE destination key1[key2..] 在SDIFF的基础上,将结果保存到集合中==(覆盖)==。不能保存到其他类型key噢!
SINTER key1 [key2..] 返回所有集合的交集
SINTERSTORE destination key1[key2..] 在SINTER的基础上,存储结果到集合中。覆盖
SUNION key1 [key2..] 返回所有集合的并集
SUNIONSTORE destination key1 [key2..] 在SUNION的基础上,存储结果到及和张。覆盖
SSCAN KEY [MATCH pattern] [COUNT count] 在大量数据环境下,使用此命令遍历集合中元素,每次遍历部分

6 ZSet类型

特点: 可排序的set集合 排序 不可重复

ZSET 官方 可排序SET sortSet

不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。

score相同:按字典顺序排序

有序集合的成员是唯一的,但分数(score)却可以重复。

6.1.内存模型

在这里插入图片描述

6.2.常用命令

命令 说明
zadd 添加一个有序集合元素
zcard 返回集合的元素个数
zrange 升序 zrevrange 降序 返回一个范围内的元素
zrangebyscore 按照分数查找一个范围内的元素
zrank 返回排名
zrevrank 倒序排名
zscore 显示某一个元素的分数
zrem 移除某一个元素
zincrby 给某个特定元素加分
#####################################################################
127.0.0.1:6379> zadd myset 1 one	# 添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three	# 添加多个值
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1)"one"
2)"two"
3)"three"

####################################################################
# 排序如何实现

127.0.0.1:6379> zadd salary 2500 xiaohong	# 添加三个用户
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 kaungshen
(integer) 1

# ZRANGEBYSCORE key min max
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf	# 显示全部的用户 从小到大!
1)"kaungshen"
2)"xiaohong"
3)"zhangsan"
127.0.0.1:6379> ZREVRANGE salary 0 -1 # 从大到进行排序!
1)"zhangsan"
2)"kaungshen"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 显示全部的用户并且附带成绩
1) "kaungshen" 
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan" 
6) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores # 显示工资小于2500员工的升序排序!
1) "kaungshen" 
2) "500"
3) "xiaohong" 
4) "2500"


####################################################################
# 移除rem中的元素

127.0.0.1:6379> zrange salary 0 -1
1)"kaungshen"
2)"xiaohong"
3)"zhangsan"
127.0.0.1:6379> zrem salary xiaohong	# 移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1)"kaungshen"
2)"zhangsan"
127.0.0.1:6379> zcard salary	# 获取有序集合中的个数
(integer) 2


####################################################################
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 kuangshen
(integer) 2
127.0.0.1:6379> zcount myset 1 3	# 获取指定区间的成员数量!
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2

应用案例:

  • set排序 存储班级成绩表 工资表排序!
  • 普通消息,1.重要消息 2.带权重进行判断
  • 排行榜应用实现,取Top N测试
命令 描述
ZADD key score member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key 获取有序集合的成员数
ZCOUNT key min max 计算在有序集合中指定区间score的成员数
ZINCRBY key n member 有序集合中对指定成员的分数加上增量 n
ZSCORE key member 返回有序集中,成员的分数值
ZRANK key member 返回有序集合中指定成员的索引
ZRANGE key start end 通过索引区间返回有序集合成指定区间内的成员
ZRANGEBYLEX key min max 通过字典区间返回有序集合的成员
ZRANGEBYSCORE key min max 通过分数返回有序集合指定区间内的成员==-inf 和 +inf分别表示最小最大值,只支持开区间()==
ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
ZREM key member1 [member2..] 移除有序集合中一个/多个成员
ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
ZREVRANGE key start end 返回有序集中指定区间内的成员,通过索引,分数从高到底
ZREVRANGEBYSCORRE key max min 返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANGEBYLEX key max min 返回有序集中指定字典区间内的成员,按字典顺序倒序
ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZINTERSTORE destination numkeys key1 [key2 ..] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中,numkeys:表示参与运算的集合数,将score相加作为结果的score
ZUNIONSTORE destination numkeys key1 [key2..] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
ZSCAN key cursor [MATCH pattern\] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)

7 hash类型

特点: value 是一个map结构 存在key value key 无序的

7.1.内存模型

在这里插入图片描述

7.2.常用命令

命令 说明
hset 设置一个key/value对
hget 获得一个key对应的value
hgetall 获得所有的key/value对
hdel 删除某一个key/value对
hexists 判断一个key是否存在
hkeys 获得所有的key
hvals 获得所有的value
hmset 设置多个key/value
hmget 获得多个key的value
hsetnx 设置一个不存在的key的值
hincrby 为value进行加法运算
hincrbyfloat 为value加入浮点值

####################################################################
127.0.0.1:6379> hset myhash field1 kuangshen	# set一个具体 key-vlaue 
(integer) 1
127.0.0.1:6379> hget myhash field1	# 获取一个字段值
"kuangshen"

#hmset再4.0之后已经弃用,不建议使用
127.0.0.1:6379> hmset myhash field1 hello field2 world	# set多个 key-vlaue OK
127.0.0.1:6379> hmget myhash field1 field2	# 获取多个字段值
1)"hello"
2)"world"
127.0.0.1:6379> hgetall myhash	# 获取全部的数据,
1)"field1"
2)"hello"
3)"field2"
4)"world"
127.0.0.1:6379> hdel myhash field1	# 删除hash指定key字段!对应的value值也就消失了!
(integer) 1
127.0.0.1:6379> hgetall myhash
1)"field2"
2)"world" 

####################################################################
hlen

127.0.0.1:6379> hmset myhash field1 hello field2 world 
OK
127.0.0.1:6379> HGETALL myhash
1)"field2"
2)"world"
3)"field1"
4)"hello"
127.0.0.1:6379> hlen myhash	# 获取hash表的字段数量!
(integer) 2


####################################################################
127.0.0.1:6379> HEXISTS myhash field1	# 判断hash中指定字段是否存在!
(integer) 1
127.0.0.1:6379> HEXISTS myhash field3 (integer) 0


####################################################################
# 只获得所有field 
# 只获得所有value

127.0.0.1:6379> hkeys myhash	# 只获得所有key
1)"field2"
2)"field1"
127.0.0.1:6379> hvals myhash	# 只获得所有value
1)"world"
2)"hello" 

####################################################################
incr	
decr

127.0.0.1:6379> hset myhash field3 5	#指定增量!
(integer) 1
127.0.0.1:6379> HINCRBY myhash field3 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello	# 如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world	# 如果存在则不能设置
(integer) 0

hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息!hash 更适合于对象的存储,String更加适合字符串存储!

命令 描述
HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。重复设置同一个field会覆盖,返回0
HMSET key field1 value1 [field2 value2..] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
HGET key field value 获取存储在哈希表中指定字段的值
HMGET key field1 [field2..] 获取所有给定字段的值
HGETALL key 获取在哈希表key 的所有字段和值
HKEYS key 获取哈希表key中所有的字段
HLEN key 获取哈希表中字段的数量
HVALS key 获取哈希表中所有值
HDEL key field1 [field2..] 删除哈希表key中一个/多个field字段
HINCRBY key field n 为哈希表 key 中的指定字段的整数值加上增量n,并返回增量后结果 一样只适用于整数型字段
HINCRBYFLOAT key field n 为哈希表 key 中的指定字段的浮点数值加上增量 n。
HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。

原文地址:https://blog.csdn.net/qq_43585922

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读1.3k次。在 Redis 中,键(Keys)是非常重要的概念,它们代表了存储在数据库中的数据的标识符。对键的有效管理和操作是使用 Redis 数据库的关键一环,它直接影响到数据的存取效率、系统的稳定性和开发的便利性。本文将深入探讨 Redis 中键的管理和操作,包括键的命名规范、常用的键操作命令以及一些最佳实践。我们将详细介绍如何合理命名键、如何使用键的过期和持久化特性、如何批量删除键等技巧,旨在帮助读者更好地理解并灵活运用 Redis 中的键,从而提高数据管理和操作的效率和可靠性。
文章浏览阅读3.3k次,点赞44次,收藏88次。本篇是对单节点的应用,但从中我们也能推断出一些关于集群的应用,不过大多数公司能搞个主从就已经是不错了,所以你能学会这个已经算是很有用了,关于ES,博主前面也讲过一些基础应用,创建一个工具类利用ES的数据模型进行存储就可以达到一个canal同时对Redis和ES的同步,如果担心出问题,可以把Canal搞成集群的形式,这个后续有时间博主再给大家做讲解。今天就到这里了,觉得不错就支持一下吧。_canal redis
文章浏览阅读8.4k次,点赞8次,收藏18次。Spring Boot 整合Redis实现消息队列,RedisMessageListenerContainer的使用,Pub/Sub模式的优缺点_springboot redis 消息队列
文章浏览阅读978次,点赞25次,收藏21次。在Centos上安装Redis5.0保姆级教程!_centos7 安装redis5.0服务器
文章浏览阅读1.2k次,点赞21次,收藏22次。Docker-Compose部署Redis(v7.2)主从模式首先需要有一个redis主从集群,才能接着做redis哨兵模式。_warning: sentinel was not able to save the new configuration on disk!!!: dev
文章浏览阅读2.2k次,点赞59次,收藏38次。合理的JedisPool资源池参数设置能为业务使用Redis保驾护航,本文将对JedisPool的使用、资源池的参数进行详细说明,最后给出“最合理”配置。_jedispool资源池优化
文章浏览阅读1.9k次。批量删除指定前缀的Key有两中方法,一种是借助 redis-cli,另一种是通过 SCAN命令来遍历所有匹配前缀的 key,并使用 DEL命令逐个删除它们。_redis删除前缀的key
文章浏览阅读890次,点赞18次,收藏20次。1. Redis时一个key-cakye的数据库,key一般是String类型,不过value类型有很多。eg.String Hash List Set SortedSet (基本) | GEO BitMap HyperLog (特殊)2.Redis为了方便学习,将操作不同类型的命令做了分组,在官网可以进行查询。
文章浏览阅读1.1k次,点赞19次,收藏26次。若不使用Redisson,而是用synchronized(this),此时会造成对服务器的加锁,若开始大量查询ID为1的商品,每台机器都会先跑一遍加个锁,然后在查询ID为2的数据,此时需要等待ID为1的锁释放,所以需要将this对象调整为全局商品ID。若在执行bgsave命令时,还有其他redis命令被执行(主线程数据修改),此时会对数据做个副本,然后bgsave命令执行这个副本数据写入rdb文件,此时主线程还可以继续修改数据。在当前redis目录下会生成aof文件,对redis修改数据的命令进行备份。
文章浏览阅读1.5k次,点赞39次,收藏24次。本文全面剖析Redis集群在分布式环境下的数据一致性问题,从基础原理到高级特性,涵盖主从复制、哨兵模式、持久化策略等关键点,同时也分享了关于监控、故障模拟与自适应写一致性策略的实践经验。_redis集群一致性
文章浏览阅读1k次。RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令。AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据。:在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF。
文章浏览阅读1k次,点赞24次,收藏21次。NoSQL(No only SQL)数据库,泛指非关系型数据库,实现对于传统数据库而言的。NoSQL 不依赖业务逻辑方式进行存储,而以简单的 key-value 模式存储。因此大大增加了数据库的扩展能力。不遵循SQL标准不支持ACID远超于SQL的性能Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。
文章浏览阅读988次,点赞17次,收藏19次。在上面的步骤中,我们已经开启了 MySQL 的远程访问功能,但是,如果使用 MySQL 管理工具 navicat 连接 MySQL 服务端时,还是可能会出现连接失败的情况。在实际工作中,如果我们需要从其他地方访问和管理 MySQL 数据库,就需要开启 MySQL 的远程访问功能并设置相应的权限。这对于我们的工作效率和数据安全都有很大的帮助。通过查看 MySQL 用户表,我们可以看到’host’为’%’,说明 root 用户登录 MySQL 的时候,可以允许任意的 IP 地址访问 MySQL 服务端。
文章浏览阅读956次。Redis Desktop Manager(RDM)是一款用于管理和操作Redis数据库的图形化界面工具。提供了简单易用的界面,使用户能够方便地执行各种Redis数据库操作,并且支持多个Redis服务器的连接_redisdesktopmanager安装包
文章浏览阅读1.9k次,点赞52次,收藏27次。缓存击穿指的是数据库有数据,缓存本应该也有数据,但是缓存过期了,Redis 这层流量防护屏障被击穿了,请求直奔数据库。缓存穿透指的是数据库本就没有这个数据,请求直奔数据库,缓存系统形同虚设。缓存雪崩指的是大量的热点数据无法在 Redis 缓存中处理(大面积热点数据缓存失效、Redis 宕机),流量全部打到数据库,导致数据库极大压力。
文章浏览阅读1.2k次。一次命令时间(borrow|return resource + Jedis执行命令(含网络) )的平均耗时约为1ms,一个连接的QPS大约是1000,业务期望的QPS是50000,那么理论上需要的资源池大小是50000 / 1000 = 50个,实际maxTotal可以根据理论值合理进行微调。JedisPool默认的maxTotal=8,下面的代码从JedisPool中借了8次Jedis,但是没有归还,当第9次(jedisPool.getResource().ping())3、发生异常可能的情况。_redis.clients.jedis.exceptions.jedisconnectionexception: could not get a res
文章浏览阅读1k次,点赞27次,收藏18次。在这篇文章中,你将了解到如何在 CentOS 系统上安装 Redis 服务,并且掌握通过自定义域名来访问 Redis 服务的技巧。通过使用自定义域名,你可以方便地管理和访问你的 Redis 数据库,提高工作效率。无论你是开发者、系统管理员还是对 Redis 感兴趣的读者,这篇文章都会为你提供清晰的指导和实用的技巧。阅读本文,轻松搭建自己的 Redis 服务,并体验自定义域名带来的便捷!_redis怎么自定义域名
文章浏览阅读1.1k次,点赞15次,收藏18次。我们post请求,拦截器要预先读取HtppServletRequest里面的body的数据,是通过io的方式,都知道io读取完毕之后,之前的数据是变为null的,但是,当我么后面的接口来委派的时候,也是通过io读取body。我们要考虑一个事情,就是我们要验证数据的重复提交: 首先第一次提交的数据肯定是要被存储的,当而第二次往后,每次提交数据都会与之前的数据产生比对从而验证数据重复提交,我们要具体判断数据是否重复提交的子类。发现数据是成功存入的,剩余7s过期,在10s之内,也就是数据没过期之前,在发送一次。_json.parseobject(str, clazz, auto_type_filter);
文章浏览阅读3.9k次,点赞3次,收藏7次。PHP使用Redis实战实录系列:我们首先检查$redis->connect()方法的返回值来确定是否成功连接到Redis服务器。如果连接失败,我们可以输出相应的错误信息。如果连接成功,我们再执行一些操作,如$redis->set()、$redis->get()等,并检查每个操作的返回结果来判断是否发生了异常。_php redis
文章浏览阅读1.5w次,点赞23次,收藏51次。Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis 是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。_redisdesktopmanager下载