Redis基础使用
1 安装
环境:Ubuntu
# 安装
sudo apt install redis-server
# 查看安装版本
redis-server --version
# 启动服务
service redis-server start
# 通过命令行使用Redis数据库
redis-cli
# 测试ping,返回PONG
ping
# 关闭服务
service redis-server stop
安装后,我们就有了这些工具
2 启动Redis
配置redis.conf
文件,根据配置进行启动
# 直接启动
redis-server [/path/to/redis.conf]
# 停止
redis-cli shutdown
redis.conf
文件模板可能会在/etc/redis/redis.conf
,你可以通过find
命令查找看看
添加一些键值对
set hello world
set java jedis
set python redis-py
rpush my_list a b c d e f g
3 单线程架构和I/O多路复用模型
因为Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。
所以当我们同时启动两个客户端各自执行命令时,Redis服务器接收到两个命令后,所有命令会进入一个队列,然后被顺序执行。不会产生并发问题。
(Redis 6.0引入了多线程)
4 通用命令
Redis是基于key-value
的数据结构服务器,它的value
有五种数据结构,操作各不相同。但是针对key
有一些通用的指令
4.1 keys-查看所有键
keys *
4.2 dbsize-键数量
dbsize
4.3 exists-检查键是否存在
exists java
exists not_exist_key
4.4 del-删除键
del java
4.5 expire/ttl-键过期
expire python 15
ttl python
4.6 type-键的数据结构类型
type hello
type mylist
5 五种数据结构
每种数据结构底层都有多种内部编码实现
5.1 object encoding-查询内部编码
object encoding hello
object encoding mylist
6 字符串
6.1 常用命令
6.1.1 set/setex/setnx-设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
setex key seconds value
setnx key value
ex seconds
秒级过期时间、px millisenconds
毫秒级过期时间、nx
不存在才设置、xx
存在才设置
6.1.2 get-获取值
get key
6.1.3 mset/mget-批量设置与获取
mset a aa b bb c cc
mget a b cc
6.1.4 incr/incrby/incrbyfloat/decr/decrby-计数
incr key
incrby key increment
incrbyfloat key increment
decr key
decrby key decrement
6.2 不常用命令
6.2.1 append-追加值
append key value
6.2.2 strlen-字符串长度
strlen key
6.2.3 getset-设置并返回值
getset key value
6.2.4 setrange-设置指定位置的字符
setrange key offset value
6.2.5 getrange-获取部分字符串
getrange key start end
6.3 三种编码方式
int
:8个字节的长整型
embstr
:小于等于44个字节的字符串
raw
:大于44个字节的字符串
7 哈希
7.1 命令
7.1.1 hset/hsetnx-设置值
hsetnx
:当key
不存在时才能成功设置值
hset key field value
hsetnx not_exist_key field value
7.1.2 hget-获取值
hget key field
7.1.3 hdel-删除field
返回成功删除field的个数
hdel key field [field ...]
7.1.4 hlen-计算field个数
hlen key
7.1.5 hmset/hmget-批量设置或获取
hmset key field value [field value ...]
hmget key field [field ...]
7.1.6 hexists-判断field是否存在
hexists key field
7.1.7 hkeys-获取所有的field
hkeys key
7.1.8 hvals-获取所有的value
hvals key
7.1.9 hgetall-获取所有的field-value
hgetall key
7.1.10 hincrby/hincrbyfloat-计数
hincrby key field increment
hincrbyfloat key field increment
7.1.11 hstrlen-计算value的字符串长度
hstrlen key field
7.2 两种内部编码
ziplist
:元素个数小于配置(默认512) && 所有值都小于配置(默认64个字节)
hashtable
:无法满足ziplist
条件时
8 列表
8.1 添加
8.1.1 rpush-从右边插入元素
rpush key value [value ...]
8.1.2 lpush-从左边插入元素
lpush key value [value ...]
8.1.3 linsert-向某个元素前或者后插入元素
linsert key before|after pivot value
8.2 查找
8.2.1 lrange-获取指定范围内的元素列表
lrange key start end
索引下标,从左到右分别是0到n-1,从右到左是-1到-n
8.2.2 lindex-获取列表指定索引下标的元素
lindex key index
8.2.3 llen-获取列表长度
llen key
8.3 删除
8.3.1 lpop-从列表左侧弹出
lpop key
8.3.2 rpop-从列表右侧弹出
rpop key
8.3.3 lrem-删除指定元素
lrem key count value
count>0,从左到右,删除最多count个value
count<0,从右到左,删除最多count个value
count=0,删除所有value
8.3.4 ltrim-按照索引范围修建列表
ltrim key start end
8.4 修改
8.4.1 lset-修改指定索引下标的元素
lset key index newValue
8.5 阻塞
8.5.1 blpop/brpop-阻塞式弹出
blpop key [key ...] timeout
brpop key [key ...] timeout
从左至右便利所有键,一旦有列表不为空,立即弹出数据返回,不然等待timeout
时间(timeout=0
时,将一直等待)
8.6 内部编码
ziplist
:当列表的元素个数小于配置(默认512个),且每个元素的值都小于配置(默认64字节)时
linkedlist
:上述条件无法满足时
quicklist
:以ziplist为节点的linkedlist,结合了两者的优势
9 集合
9.1 集合内命令
9.1.1 sadd-添加元素
sadd key element [element ...]
9.1.2 srem-删除元素
srem key element [element ...]
9.1.3 scard-计算元素个数
scard key
9.1.4 sismember-判断元素是否在集合中
sismember key element
9.1.5 srandmember-随机从集合返回指定个数元素
srandmember key [count]
9.1.6 spop-从集合随机弹出元素
spop key [count]
spop
与srandmember
的区别是,spop
会删除取出的元素,srandmember
不会
9.1.7 smembers-获取所有元素
smembers key
9.2 集合间命令
9.2.1 sinter-求交集
sinter key [key ...]
9.2.2 sunion-求并集
sunion key [key ...]
9.2.3 sdiff-求差集
sdiff key [key ...]
9.2.4 sinterstore/sunionstore/sdiffstore-保存结果
sinterstore dest_key key [key ...]
sunionstore dest_key key [key ...]
sdiffstore dest_key key [key ...]
9.3 两种内部编码
intset
:元素都是整数且元素个数小于配置(默认512个)
hashtable
:不满足intset
条件时
10 有序集合
10.1 集合内命令
10.1.1 zadd-添加成员
zadd key [nx|xx] [ch] [incr] score member [score member ...]
有序集合以score为依据进行排序
nx
:member
必须不存在,才能设置成功,用于添加
xx
:member
必须存在,才能设置成功,用于更新
ch
:返回此次操作后,有序集合发生变化的个数
incr
:对score
做增加,等价于zincrby
10.1.2 zcard-计算成员个数
zcard key
10.1.3 zscore-返回某个成员的分数
zscore key member
10.1.4 zrank/zrevrank-计算成员的排名
zrank key member
zrevrank key member
zrank
:升序
zrevrank
:降序
10.1.5 zrem-删除成员
zrem key member [member ...]
10.1.6 zincrby-增加成员分数
zincrby key increment member
10.1.7 zrange/zrevrange-返回指定排名范围的成员
zrange key start end [withscores]]
zrevrange key start end [withscores]
10.1.8 zrangebyscore/zrevrangebyscore-返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
limit
选项:限制输出的起始位置和个数
max
、min
选项:支持+inf
、-inf
、(
开区间
10.1.9 zcount-返回指定分数范围成员个数
zcount key min max
10.1.10 zremrangebyrank-删除指定排名内的升序元素
zremrangebyrank key start end
10.1.11 zremrangebyscore-删除指定分数范围的成员
zremrangebyscore key min max
10.2 集合间命令
10.2.1 zinterstore-交集
zinterstore dest_key num_of_keys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
weights
:默认为1
aggregate
:默认是sum
10.2.2 zunionstore-并集
zunionstore dest_key num_of_keys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
10.3 内部编码
ziplist
:元素个数小于配置(默认128个)且每个元素的值都小于配置(默认64字节)时
skiplist
:无法满足ziplist
条件时
11 键管理
11.1 单个键
11.1.1 rename-键重命名
rename key newkey
renamenx key newkey
如果rename之前,键key_new_test已存在,则会被覆盖,为避免被覆盖,可以用renamenx
11.1.2 randomkey-随机返回一个键
randomkey
11.1.3 expire/ttl/expireat/persist-键过期
expire key seconds
pexpire key milliseocnds
expireat key timestamp
pexpireat key milliseconds-timestamp
ttl key
pttl key
persist
expire
设置秒级过期时间,pexpire
设置毫秒级过期时间
无论使用过期时间、时间戳、秒级、毫秒级,Redis内部最终都使用pexpirat
ttl=-1
表示没设置过期时间,ttl=-2
表示键不存在
persist
:清除键过期设置(set
命令也可以清除过期时间)
11.1.4 move/dump+restore/migrate-迁移键
move key db
Redis内部默认有16个数据库(0-15),通过move
可以进行数据迁移,但不建议这样操作
dump key
restore key ttl serialized_value [replace]
replace
选项:已存在key
则替换它的内容
ttl=0
:表示不设置过期时间
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]
host
:目标Redis的IP地址
port
:目标Redis的端口号
key|""
:只迁移一个键时填写key,迁移多个填写空字符串
destination-db
:目标Redis的数据库索引
timeout
:超时时间设置
copy
:迁移后并不删除源键
replace
:不管目标Redis是否存在都会正常迁移进行数据覆盖
keys key [key ...]
:迁移多个键
11.2 遍历键
11.2.1 keys-全量遍历键
keys pattern
利用模式匹配,删除所有以a开头的键
redis-cli keys a* | xargs redis-cli del
11.2.2 scan-渐进式遍历
渐进式遍历可以有效的解决keys
命令可能产生的阻塞问题,但是如果在scan的过程中如果有键的变化,可能出现:新增的键可能没有遍历到、遍历出现了重复的键等问题
scan cursor [match pattern] [count count]
cursor
:第一次遍历从0开始
match
:默认*
count
:默认10
11.3 数据库管理
11.3.1 select-切换数据库
多数据库的使用会让调试和运维不同业务的数据库变得困难,假如有一个慢查询存在,会影响其他数据库,定位问题变得复杂
select db_index
11.3.2 flushdb/flushall-清除数据库
flushdb
flushall
flushdb
:清除当前数据库
flushall
:清除所有数据库
12 可能存在的错误或警告
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel
Linux透明大页的使用与禁用介绍 - 知乎 (zhihu.com)
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.
Redis 优化之内存分配控制 vm.overcommit_memory_redis vm.overcommit_memory_富士康质检员张全蛋的博客-CSDN博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律