学习redis api的方法:
1:理解redis的一些机制,会发现这些命令有很强的通用性。
2:redis不是万金油,有些数据结构和命令必须在特定场景下使用。
keys * :查询当前数据库中中的所有键
dbsize:数据库键的数量
rpush :插入一个列表数据
exists:判断键是否存在
del: 支持删除多个键 del key1 key2
设置键过期:expire key second 到期后会自动删除键
通过ttl 命令可以观察距离键的过期时间
type :查看键的类型
object encoding:查看键的内部编码实现
字符类型命令: 字符串类型内部编码:int emnstr(小于等于39字节字符串) raw
设置值:
set key value nx (nx代表键必须不存在,才能将该键向数据库添加成功。相当于向数据库添加一个新键)
set key value xx(键必须存在才能向数据库添加该建,相当于修改的情况)这里简单的介绍一下一下,setnx可以作为分布式锁的一种实现方案。
获取值:
get key
批量的设置与获取值 mset key1 value1 key2 value2 key3 value3
mget key1 key2,key3
推荐使用批量操作:
如果使用get,执行n次命令所需时间:n次get时间=n次网络时间+n次命令时间
使用mget:n次get时间:1次网络时间+n次get时间
这里n次时间是指客户端的时间,因为redis客户端与服务器通过网络套接字通信。
追加值命令:
append key value
字符串长度:
strlen key
设置并返回原来的值:
设置指定位置的字符:
setrange key offset value (offset 代表值的偏移位置) 如果value大于当前字符长度会进行覆盖后面的值。
getrange key start end(必须有start 与end不然会报错)
哈希命令:hash类型内部编码:ziplist hashtable
hset key field value
hget key field
批量添加field value
hmset key field1 value1 field2 value2
批量获得field1 field2
hmget key field1 field2
判断field是否存在:
hexists key field
获取key的所有field
hkeys key
获取key所具有的filed的所有的value:
hvals key
获取所有的field-value
hgetall key
计算字符串的长度:
hstrlen key
列表命令:内部编码:linkedlist ziplist 列表可以用来存储多个有序的字符串,记住列表是有序的,列表中的元素可以是重复的
rpush key value
范围查找:
lrange key start end
lrange key 0 -1 可以从左到右获取列表的所有元素
从左边插入元素:
lpush key value
向某个元素前/后插入元素:
linsert key before |after pivot(具体元素的值) value
获取列表指定索引下标的元素:
lindex key index (index为-1代表最右边第一个元素,-1之后没有了)
获取列表长度:
llen key
删除:
从列表左侧弹出元素:
lpop key
从列表右侧弹出元素:
rpop key
删除指定元素:
lrem key count value
因为列表可以具有重复元素:所以当count>0 代表从左到右开始删除 count个值等于value的元素
当count<0 代表从右到左开始删除 count个值等于value的元素
当count==0时,代表删除所有值等于value的元素
按照索引范围修剪列表:
ltrim listkey 1 3
只保留listkey的第二个和第四个元素
修改指定索引下标的元素:
lset key index newvalue
brpop 阻塞式的获得列表尾部的元素,如果列表尾部有元素则返回,否则就阻塞。
集合命令:内部编码:intset (为什么用intset还是无序,根据书上说的intset底层数组难道不是有序的吗?)hashtable
问题解答:intset编码的集合里面的元素是有序的(按照整数从小到大排列),hashtable编码的集合是无序的。
集合类型也是用来保存多个hash的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素
添加元素:
sadd key element1 element2...
删除元素:
srem key element1 element2
计算元素个数:
scard key
判断元素是否在集合中:
sismember key element
随机从集合返回指定个数元素:
srandmember key count (count可选,默认为1)
从集合中随机弹出元素:
spop key
获取所有元素:
smembers key
求交集:
sinter key1 key2
求并集:
sunion key1 key2
求差集:
sdiff key1 key2 需要注意key1 key2的顺序
将交,并,差集合结果进行保存:
sinterstore destination key1 key2...
sunionstore destination key1 key2...
sdiffstore destination key1 key2....
有序集合:内部编码:压缩列表,跳跃表
压缩列表每个集合元素使用两个相邻的压裂列表节点表示,第一个节点保存元素的值,第二个节点保存元素的分值。
跳跃表由哈希表与跳跃表组成。哈希表使得获取成员的时间复杂度降低,而跳跃表可以使得获取排名,执行范围查找时间复杂度降低。
有序集合中的元素可以排序是因为它给每个元素都设置了一个分数。
添加元素:
zadd key score member score mmber2
计算成员个数
zcard key
计算某个成员的分数:和有序集合底层实现有关,所以执行此命令较快。
zscore key member
计算某个成员的排名:
zrank key member 计算正向排名
zrerank key member 计算逆向排名
删除成员:
zrem key member (删除成员)
增加成员的分数:
zincrby key 分数 member(分数代表增加的分数)
返回指定下标的元素:
zrange key start end (按照得分从小到大排序) (withscores)可选参数,带上也返回得分
zrevrange key start end(按照得分从大到小排序)(withscores)
返回指定分数范围的成员:
zrangebyscore key min max (withscore) 从小到大返回
zrevrangebyscore key min max(withscore) 从小到大返回
返回指定分数范围成员个数:
zcount key min max(min 与max都包含)
范围删除:
删除指定排名范围内的升序元素:
zremrangebyrank key start end
删除指定分数范围内的元素:
zremrangebyscore key min max
集合间的操作:
交集:
zinterstore destination numkeys key1 key2... weights weights... aggregate sum|min|max
zinterstore key3 2 key1 key2 1 0.5 aggregate sum
key1的成员变量member权重为1,key2的member权重为0.5 计算所得交集 分值按照sum进行汇总
numkeys:需指定参与交集的key的个数,必须指定,上面就是两个,所以指定为2
键的管理
键的通用命令:
type del object exists expire
键重命名
rename key newkey
方式newkey与已经存在在数据库中的键重复,采用
renamenx 只有在newkey不存在时,才可以使用rename key newkey
随机返回一个键:
randomkey
键过期:
expire key seconds(秒级)
expire key timestamp(时间戳)
毫秒级过期时间设置
pexpire key milliseconds
pexpire key milliseconds-timestamp
过期时间为-1,代表不会失效
使用expire key的键不存在,返回结果为0
如果过期时间为副值,键会立即被删除 example:
expire key -2
persist:命令可以将键的过期时间删除
小提示:对于字符串类型键,执行set命令会去掉过期时间
迁移键:实现在不同实例之间进行数据迁移过程功能
(1)dump key:在源主机上执行,dump命令会将键值序列化,格式采用rdb格式
restore key ttl value(ttl=0则代表没有过期时间)
(2)migrate:命令也是在redis实例之间进行数据迁移的,migrate命令的执行是原子性的,不同于dump在多个redis实例上开启客户端,migrate命令传输直接在源reids和目标redis上
完成,目标redis完成restore后会发送ok给源redis
渐进式遍历:
scan:它能有效的解决keys命令存在的问题。和keys命令执行时会遍历所有键不同,scan采用渐进式遍历的方法来解决keys命令可能带来的阻塞问题,每次scan命令的时间复杂度是o(1)
要实现keys所提供的的功能,需要多次进行scan
scan cursor match_pattern count number
match_pattern:可选 代表支持正则表达式匹配;
count_number:可选 代表每次需要遍历的个数
cursor 必须要有,每一执行完scan 都会返回下一个cursor,拿到下一个cursor即可继续向下遍历,直到cursor返回0,代表全部遍历。
select db 选择数据库
flushdb 清楚当前数据库
flushall 清楚所有数据库