redis默认有16个数据库, 默认使用的是第0个
127.0.0.1:6379> select 3 #切换数据库
OK
127.0.0.1:6379[3]> DBSIZE #查看DB大小
(integer) 0
dbsize
127.0.0.1:6379[3]> keys *
1) "name"
127.0.0.1:6379[3]>
dbsize不会遍历所有键,而是直接获取Redis内置的键总数变量,时间复杂度O(1)
keys命令会遍历所有键,时间复杂度O(n),当Redis里面保存了大量的键时,线上环境禁止使用
del key
127.0.0.1:6379[3]> FLUSHDB
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]>
127.0.0.1:6379[3]> FLUSHALL
OK
127.0.0.1:6379[3]>
Redis是单线程的
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
127.0.0.1:6379[3]> set name aaa #设置值
OK
set命令有几个选项:
ex seconds:为键设置秒级过期时间
px milliseconds :为键设置毫秒级过期时间
nx:键必须不存在,才可以设置成功,添加,相关命令setnx
xx:键必须存在,才可以设置成功,更新相关命令setxx
因为Redis是单线程命令处理机制,如果有多个客户端同时执行setnx,只有一个能设置成功
setnx可以作为分布式锁的一种实现方式
127.0.0.1:6379[3]> keys *
1) "name"
127.0.0.1:6379[3]> move name 1 #移动key到另一个数据库
(integer) 1
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]> select 1
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> type name #查看当前key类型
string
127.0.0.1:6379[3]> set name bbb
OK
127.0.0.1:6379[3]> keys *
1) "name"
127.0.0.1:6379[3]> get name #获取值
"bbb"
127.0.0.1:6379[3]> EXPIRE name 10 #设置key有效时间(秒)
(integer) 1
127.0.0.1:6379[3]> ttl name #获取key的有效时间(秒)
(integer) 6
127.0.0.1:6379[3]> ttl name
(integer) 5
127.0.0.1:6379[3]> ttl name
(integer) 4
127.0.0.1:6379[3]> ttl name
(integer) 2
127.0.0.1:6379[3]> ttl name
(integer) 1
127.0.0.1:6379[3]> EXISTS name #查看当前key是否存在
(integer) 0
127.0.0.1:6379[3]> get name
(nil)
127.0.0.1:6379[3]> mset a 1 b 2 c 3 #批量设置值
OK
127.0.0.1:6379[3]> mget a b c #批量获取值
1) "1"
2) "2"
3) "3"
type命令实际上返回的就是当前键的数据结构类型,他们分别是:
但是这只是Redis对外的数据结构
实际上每种数据结构都有自己底层内部的编码实现
可以通过object encoding 命令查询内部编码
127.0.0.1:6379> set hello aaa
OK
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> rpush mylist a
(integer) 1
127.0.0.1:6379> object encoding mylist
"quicklist"
原文:https://www.cnblogs.com/chanrich/p/14855875.html