Redis数据库相关指令大合集

Posted 秦 羽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis数据库相关指令大合集相关的知识,希望对你有一定的参考价值。

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

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

Redis数据库相关指令

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不存在时进行set127.0.0.1:6379> SETNX msg test (integer) 0 127.0.0.1:6379> SETNX name sakura (integer) 1
SETEX key seconds valueset 键值对并设置过期时间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:6372017下半年8场云计算相关会议合集 聚焦大数据未来!

1951: [Sdoi2010]古代猪文|数论大合集

Redis中Key相关的常用指令详解

Redis基础

Redis基础

Redis基础