数据库

12. Redis 数据类型和常用命令

2021-03-06  本文已影响0人  随便写写咯

6. Redis数据类型

命令不区分大小写, key和value区分大小写

6.1 字符串(string)

6.1.1 创建一个key

127.0.0.1:6379> set code 'hello world'
OK
127.0.0.1:6379> get code
"hello world"
127.0.0.1:6379> type code # type用来查看数据类型
string
# 命令不区分大小写, 数据区分大小写

127.0.0.1:6379> SET NAME dave
OK
127.0.0.1:6379> get NAME
"dave"
127.0.0.1:6379> get name
(nil)
# ex 用来指定有效期, 以秒为单位

127.0.0.1:6379> set name aaa ex 5 
OK
127.0.0.1:6379> get name
"aaa"
127.0.0.1:6379> get name # 5秒后过期
(nil)
# nx: 当key不存在时, 才对其进行赋值

127.0.0.1:6379> get NAME
"dave"
127.0.0.1:6379> set NAME bbb nx  # NAME已经存在, 因此不会重新赋值
(nil)
127.0.0.1:6379> get NAME
"dave"
# xx: 当key存在时, 才对其进行赋值

127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name ccc xx  # name不存在, 因此不会赋值
(nil)
127.0.0.1:6379> set NAME ccc xx
OK
127.0.0.1:6379> get NAME
"ccc"

6.1.2 获取一个key

127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get NAME
"ccc"
# mget: 同时获取多个key

127.0.0.1:6379> mget name NAME
1) (nil)
2) "ccc"
# keys配合通配符, 获取指定模式的key, 但是不会显示其值

127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> keys k*
1) "key1"
2) "key2"
# keys *: 获取所有的key

1) "key1"
2) "code"
3) "NAME"
4) "key2"

6.1.3 删除key

127.0.0.1:6379> del key1  # 删除单个key
(integer) 1
127.0.0.1:6379> del key2 code # 删除多个key
(integer) 2
127.0.0.1:6379> keys *
1) "NAME"

6.1.4 批量创建多个key

# mset: 奇数位为key, 偶数位为值

127.0.0.1:6379> mset 1 2 3 4 5 6 
OK
127.0.0.1:6379> mget 1 3 5
1) "2"
2) "4"
3) "6"

6.1.5 追加数据

# append: 结果仍是字符串

127.0.0.1:6379> append city "sh gz sz" 
(integer) 10
127.0.0.1:6379> get city
"bjsh gz sz"
127.0.0.1:6379> set country cn
OK
127.0.0.1:6379> append country " usa au jp"  # 追加时, 左侧要有一个空格, 避免追加后和原有的字符串连在一起
(integer) 12
127.0.0.1:6379> get country
"cn usa au jp"

6.1.6 设置新值并同时返回旧值

127.0.0.1:6379> get NAME
"ccc"
127.0.0.1:6379> getset NAME ddd
"ccc"
127.0.0.1:6379> get NAME
"ddd"

6.1.7 查看字符串key对应值所占的字节数

127.0.0.1:6379> get NAME
"ddd"
127.0.0.1:6379> strlen NAME
(integer) 3

6.1.8 判断key是否存在

127.0.0.1:6379> exists NAME
(integer) 1  # 1表示存在
127.0.0.1:6379> del NAME
(integer) 1
127.0.0.1:6379> exists NAME
(integer) 0 # 0表示不存在

6.1.9 查看key的过期时间

# ttl: -1 表示永不过期, -2 表示已经过期或者key不存在, 1,2,3..表示剩余有效时间, 以秒为单位

127.0.0.1:6379> ttl city 
(integer) -1

6.1.10 重新设置key的过期时间

# expire

127.0.0.1:6379> set location la ex 10
OK
127.0.0.1:6379> expire location 20
(integer) 1
127.0.0.1:6379> ttl location
(integer) 16
127.0.0.1:6379> ttl location
(integer) 15
127.0.0.1:6379> ttl location
(integer) 14
127.0.0.1:6379> ttl location
(integer) 13

6.1.11 取消key的有效期

# persist

127.0.0.1:6379> set  location la ex 20
OK
127.0.0.1:6379> ttl location
(integer) 16
127.0.0.1:6379> persist location
(integer) 1
127.0.0.1:6379> ttl location
(integer) -1

6.1.12 数值递增

redis实现自增, 比如点赞功能, 由于redis是单线程处理请求, 因为自增的时候不会冲突, 是串行执行
# incr

127.0.0.1:6379> set id 1 
OK
127.0.0.1:6379> incr id
(integer) 2
127.0.0.1:6379> incr id
(integer) 3
127.0.0.1:6379> incr id
(integer) 4
127.0.0.1:6379> get id
"4"
# 当key不存在, 那么incr会从0开始自增, 每次加1

127.0.0.1:6379> get number
(nil)
127.0.0.1:6379> incr number
(integer) 1
127.0.0.1:6379> get number
"1"

6.1.13 数值递减

# decr

127.0.0.1:6379> get id
"4"
127.0.0.1:6379> decr id
(integer) 3
127.0.0.1:6379> decr id
(integer) 2
127.0.0.1:6379> decr id
(integer) 1
127.0.0.1:6379> decr id
(integer) 0
127.0.0.1:6379> decr id
(integer) -1 # 可以递减成负数
127.0.0.1:6379> decr id
(integer) -2
# 如果key不存在, decr会从0开始自减, 每次减1

127.0.0.1:6379> get number
"1"
127.0.0.1:6379> get num
(nil)
127.0.0.1:6379> decr num
(integer) -1

6.1.14 数值增加

# incrby NUM

127.0.0.1:6379> get num
(nil)
127.0.0.1:6379> decr num
(integer) -1
127.0.0.1:6379> incrby num 1
(integer) 0
127.0.0.1:6379> incrby num 10
(integer) 10

6.1.15 数值减少

# decrby NUM

127.0.0.1:6379> get num
(nil)
127.0.0.1:6379> decr num
(integer) -1
127.0.0.1:6379> incrby num 1
(integer) 0
127.0.0.1:6379> incrby num 10
(integer) 10
127.0.0.1:6379> decrby num 10
(integer) 0

6.2 列表(list)

有序
双向管道, 左右都可以写入, 先进先出
列表值可以重复

6.2.1 创建列表并插入数据

127.0.0.1:6379> lpush city bj sh gz sz
(integer) 4
127.0.0.1:6379> type city
list
127.0.0.1:6379> rpush country cn jp kr 
(integer) 3

6.2.2 查看列表中元素的个数

127.0.0.1:6379> llen city
(integer) 4

6.2.3 获取指定位置的数据

lrange: 从左到右, 按照范围, 必须指定两个索引编号
没有rrange

127.0.0.1:6379> lrange city 0 0  # 查看第0个元素
1) "sz"
127.0.0.1:6379> lrange city 0 2
1) "sz"
2) "gz"
3) "sh"
127.0.0.1:6379> lrange city 0 -1 # 查看列表所有元素
1) "sz"
2) "gz"
3) "sh"
4) "bj"
lindex: 从左到右, 按照索引编号, 取单个值

127.0.0.1:6379> lindex city 0
"sz"

6.2.4 修改列表指定索引对应的值

127.0.0.1:6379> lrange city 0 -1
1) "sz"
2) "gz"
3) "sh"
4) "bj"
127.0.0.1:6379> lset city 0 as
OK
127.0.0.1:6379> lrange city 0 -1
1) "as"
2) "gz"
3) "sh"
4) "bj"

6.2.5 移除列表数据

元素全部移除后, 列表也会被删除
lpop: 从左移除

127.0.0.1:6379> lrange city 0 -1
1) "as"
2) "gz"
3) "sh"
4) "bj"
127.0.0.1:6379> lpop city
"as"
127.0.0.1:6379> lrange city 0 -1
1) "gz"
2) "sh"
3) "bj"
rpop: 从右移除

127.0.0.1:6379> lrange city 0 -1
1) "gz"
2) "sh"
3) "bj"
127.0.0.1:6379> rpop city
"bj"
127.0.0.1:6379> lrange city 0 -1
1) "gz"
2) "sh"

6.3 集合

set是string类型的无序集合, 集合中的成员是唯一的, 这就意味着集合中不能出现重复的数据
可以在两个不同的集合中对数据进行比对并取值, 常用于取值判断, 统计交集等场景
实现共同好友
集合的值不能重复
无需
集合间操作

6.3.1 创建集合

127.0.0.1:6379> sadd set1 v1
(integer) 1
127.0.0.1:6379> sadd set2 v1 v4
(integer) 2
# 集合中的重复值会被自动去重

127.0.0.1:6379> sadd set3 v1 v1 v1
(integer) 1
127.0.0.1:6379> smembers set3
1) "v1"

6.3.2 查看集合中所有元素

127.0.0.1:6379> smembers set1
1) "v1"
127.0.0.1:6379> smembers set2
1) "v4"
2) "v1"

6.3.3 集合中追加数值

127.0.0.1:6379> smembers set3
1) "v1"
127.0.0.1:6379> sadd set3 v1  # 追加重复数据不会生效, 自动去重
(integer) 0
127.0.0.1:6379> smembers set3
1) "v1"
127.0.0.1:6379> sadd set3 v2
(integer) 1
127.0.0.1:6379> smembers set3
1) "v2"
2) "v1"

6.3.4 删除集合中的元素

127.0.0.1:6379> smembers set3
1) "v2"
2) "v1"
127.0.0.1:6379> srem set3 v2
(integer) 1
127.0.0.1:6379> smembers set3
1) "v1"

6.3.5 集合间交集

127.0.0.1:6379> smembers set1
1) "v1"
127.0.0.1:6379> smembers set2
1) "v4"
2) "v1"
127.0.0.1:6379> sinter set1 set2
1) "v1"

6.3.6 集合间差集

127.0.0.1:6379> sdiff set1 set2 # 取差集时, 第一个集合的元素要比第二个集合多
(empty list or set)
127.0.0.1:6379> sdiff set2 set1
1) "v4"

6.3.6 集合间并集

127.0.0.1:6379> sunion set1 set2
1) "v4"
2) "v1"

6.4 有序集合sorted set

集合自动排序
靠打分机制, 给每个元素打分; 不同的元素可以打分相同, 一个元素只能有一个分数
redis有序集合和集合一样也是string类型的元素集合, 且不允许重复的成员, 会被自动去重
不同的是, 每个元素都会关联一个double(双精度浮点型)类型的分数,
redis正是通过该分数来为集合中的成员进行从小打到的排序, 有序集合的成员是唯一的, 但分数是可以重复的
集合是通过哈希表来实现, 所以添加, 删除, 查找的复杂度都是O(1), 集合中最大的成员数为2^32-1个, 每个集合开业存储40多亿个成员, 常用于排行榜场景
有序集合的特点:
有序
无重复元素
每个元素是由score和value组成
score可以重复
value不可以重复
对于同一个value, 多次打分, 后来的生效

6.4.1 生成有序集合

127.0.0.1:6379> zadd set 100 dave
(integer) 1
127.0.0.1:6379> zadd set 100 dave 90 admin 80 boss # 生成多个元素有序集合, 奇数位为分数, 偶数位为值
(integer) 2

6.4.2 生成排行榜

127.0.0.1:6379> zadd set 100 dave 90 admin 80 boss
(integer) 2
127.0.0.1:6379> zrange set 0 -1  # zrange表示正序从小到大排序
1) "boss"
2) "admin"
3) "dave"
127.0.0.1:6379> zrevrange set 0 -1 # zrevrange表示倒序从大到小排序
1) "dave"
2) "admin"
3) "boss"
127.0.0.1:6379> zrevrange set 0 -1 withscores # withscores显示每个元素的分数
1) "dave"  
2) "100"
3) "admin"
4) "90"
5) "boss"
6) "80"

6.4.3 获取集合中元素的个数

127.0.0.1:6379> zcard set
(integer) 3

6.4.4 基于索引返回value

127.0.0.1:6379> zrange set 0 -1 
1) "boss"
2) "admin"
3) "dave"
127.0.0.1:6379> zrange set 0 1
1) "boss"
2) "admin"
127.0.0.1:6379> zrange set 0 100 # 超出索引范围不会报错
1) "boss"
2) "admin"
3) "dave"

6.4.5 返回某个value的索引(排名)

127.0.0.1:6379> zrange set 0 -1
1) "boss"
2) "admin"
3) "dave"
127.0.0.1:6379> zrank set boss  # 集合安装正序排名
(integer) 0
127.0.0.1:6379> zrevrank set boss # 集合按照倒序排名
(integer) 2

6.4.6 获取某个value的分数

127.0.0.1:6379> zscore set dave
"120"

6.4.7 删除集合中的元素

127.0.0.1:6379> zrange set 0 -1
1) "boss"
2) "admin"
3) "dave"
127.0.0.1:6379> zrem set boss
(integer) 1
127.0.0.1:6379> zrange set 0 -1
1) "admin"
2) "dave"

6.5 哈希

hash特别适合用于对象存储
hash是一个string类型的字段(field)和值(value)的映射表, redis中每个hash可以存储2^32-1个键值对, 类似于字典存放了多个k/v对
图片.png

6.5.1 生成hashkey

127.0.0.1:6379> hset 9527 name zhouxingxing age 20 # 奇数位为field, 偶数位为value
(integer) 2
127.0.0.1:6379> type 9527
hash
127.0.0.1:6379> hgetall 9527
1) "name"
2) "zhouxingxing"
3) "age"
4) "20"
# 增加field

127.0.0.1:6379> hset 9527 gender male
(integer) 1
127.0.0.1:6379> hgetall 9527 # 获取所有field的value
1) "name"
2) "zhouxingxing"
3) "age"
4) "20"
5) "gender"
6) "male"

6.5.2 获取hash key的对应字段的值

127.0.0.1:6379> hget 9527 name # hget获取单个field的value
"zhouxingxing"
127.0.0.1:6379> hmget 9527 name age # hmget获取多个field的value
1) "zhouxingxing"
2) "20"

6.5.3 删除一个hash key的对应字段

127.0.0.1:6379> hdel 9527 name
(integer) 1
127.0.0.1:6379> hget 9527 name
(nil)

6.5.4 批量设置hash key的多个field和value

127.0.0.1:6379> hmset alibaba ceo mayun age 50 gender male
OK
127.0.0.1:6379> hgetall alibaba
1) "ceo"
2) "mayun"
3) "age"
4) "50"
5) "gender"
6) "male"

6.5.5 获取hash中多个指定字段的值

127.0.0.1:6379> hmget alibaba ceo age # hmget获取多个字段对应的value, hget获取单个字段对应的value
1) "mayun"
2) "50"

6.5.6 获取hash中所有字段的field

127.0.0.1:6379> hkeys alibaba
1) "ceo"
2) "age"
3) "gender"

6.5.7 获取hash key对应所有field的value

127.0.0.1:6379> hvals alibaba
1) "mayun"
2) "50"
3) "male"

6.5.8 获取指定hash key的所有filed及value

127.0.0.1:6379> hgetall alibaba
1) "ceo"
2) "mayun"
3) "age"
4) "50"
5) "gender"
6) "male"

6.5.9 删除hash key

127.0.0.1:6379> del alibaba
(integer) 1

6.5.10 查看某个key是否存在

127.0.0.1:6379> exists alibaba
(integer) 0

7. Redis常用命令

7.1 info

显示当前节点redis的运行状态, 可以跟字段名

127.0.0.1:6379> info
# Server
redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:28849dbea6f07cc8
redis_mode:standalone
os:Linux 4.18.0-193.el8.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:8.3.1
process_id:753
run_id:fb7c86f04a4936a880dfd3d00bef4a7a35e3945a
tcp_port:6379
uptime_in_seconds:28625
127.0.0.1:6379> info server # 查看server字段信息
# Server
redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:28849dbea6f07cc8
redis_mode:standalone
os:Linux 4.18.0-193.el8.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:8.3.1
process_id:753
run_id:fb7c86f04a4936a880dfd3d00bef4a7a35e3945a
tcp_port:6379
uptime_in_seconds:28664
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:4422089
executable:/usr/bin/redis-server
config_file:/etc/redis.conf
info replication
info clients

7.2 config

用于查看当前redis配置, 以及不重启redis服务实现动态更改redis配置等

注意:不是所有配置都可以动态修改, 且以此方式无法持久保存

举例: config临时设置redis密码

config set requirepass 123456789

举例: 获取当前redis的配置信息

config get *

举例: 查看某一指令的配置信息

127.0.0.1:6379> config get bind
1) "bind"
2) "0.0.0.0"

举例: 临时提高redis占用的内存

redis一般内存设为物理机的一般, 专用来存放数据
至于其程序运行, 还需要额外占用内存空间
config set maxmemory 8589934592 #以字节为单位

7.3 select

切换数据库

select 1

注意: redis cluster模式下不支持多个数据库.

7.4 keys命令

查看当前库下的所有key, 支持通配符, 生产环境禁用

7.5 bgsave

手动在后台执行RDB持久化操作

7.6 dbsize

返回当前库下的所有key的数量
info命令的最后一行会返回所有库所有key的数量

7.7 flushdb

强制清空当前库中所有的key, 当前所在库

7.8 flushall

强制清空当前redis服务器所有库中的所有key, 所有库

生产建议把flushdb, flushall, config命令都禁用, 清空命令不应该使用, 而config命令也尽量不要去临时调整redis配置

vim /etc/redis.conf
rename-command flushall ""
rename-command flushdb ""
rename-command config "" # 直接禁用某个命令, 此为ranme-command的配置在登录redis后执行config get命令是查不到的, 并不会显示
rename-command config linux # 这样想要执行config, 只能执行linux, 相当于把config换个名字
上一篇下一篇

猜你喜欢

热点阅读