Redis深度历险(7)-常见操作及基本数据结构

一.基本命令

0.通用命令
// 登陆redis客户端
redis-cli -h ipAddress -p port -a password
// 查看redis信息
info <memory>
// 尝试连接
ping
// 查看key是否存在
exists key 
// 设置key的过期时间(秒)
expire key seconds
// 设置key的过期时间(毫秒) 
pexpire key millseconds
// 通过正则表达式查询key
keys pattern
// 将key移到其他db
move key dbName
// 取消过期时间
persist key
// 查看key的过期时间(秒)
ttl key
// 查看key的过期时间(毫秒)
pttl key
// 随机返回一个key
randomkey
// 重命名key
rename oldKeyName newKeyName
// 查看key的类型
type key
// 删除key
del key
1.string的基本命令

字符串常用域热点数据的缓存以及简单的逻辑关系实现,以及分布式锁的实现。

// 添加key和value
set key value
// 获取key的value
get key
// 如果key不存在则添加
setnx key value 
// 添加key并设置过期时间
setex key value
// 在key不存在时添加key并设置过期时间
set key value ex expireTime nx
// 批量添加key-value
mset key1 value1 key2 value2 ...
// 获取key的value并设置新的value
getset key newValue
// 批量获取key
mget key1 key2 ...
// 查看key的value长度
strlen key
// 自增key的value
incr key
// 增量递增key的value
incrby key increment
// 自减key
decr key 
// 增量递减key的value
decrby key decrement
// 在key的value之后追加
append key value
2.list的基本命令

列表常用于库存限制以及实现队列和栈,使用blpop或brpop更可以实现简单的阻塞队列

// 右push
rpush listName v1 v2 v3
// 左push
lpush listName v1 v2 v3
// 右pop
rpop listName
// 左pop
lpop listName
// 在等待时间内阻塞左读取
blpop listName timeOut
// 在等待时间内阻塞右读取
brpop listName timeOut
// 查看长度
llen listName
// 遍历
lrange key startIndex endIndex
// 修改指定位置的元素
lset listName index value
// 删除指定位置的元素
lrem ket count value
// 将制定位置的链表截取出来替代原链表
ltrim key startIndex endIndex
3.hash的基本命令

哈希常用与存储关系型实体,例如使用key存储学生id,而以name和age作为field存储姓名与年龄。在字段相同时,更推荐使用hash来取代string存储数据

// 添加key-filed-value对
hset key field value
// 批量添加
mhset key filed1 value1 field2 value2 ...
// 获取key-field的值
hget key field
// 批量获取key-field的值
hmget key field1 field2...
// 查看key的field数
hlen key
// 获取到key的所有field和值
hkeys key
// 获取到key的所有field和值
hgetall key
// 批量获取key的field
hmget key field1 field2 ...
4.set的基本命令

集合常用实现好友关系中的共同好友以及点赞次数去重等(由于set自身基于hash实现,具有去重功能)

// 在集合中添加元素
sadd key value1 value2 ...
// 获取集合中元素的个数
scard key
// 查看集合1中相对于集合1的差集
sdiff key1 key2
// 查看集合1与2的交集
sinter key1 key2
// 查看集合1与2的并集
sunion key1 key2
// 查看member是否为key的元素
sismember key member
// 获取key的所有元素
smembers key
// smove key1 key2 member
将key1中的member移动到key2中
// spop key
移除并获取key的随机元素
// srem key member1 member2 ...
5.zset基本命令

有序集合常常被用于实现实时的排行榜、积分榜等需要很强实时性的排序需求

// 在有序集合中添加多个带权重的元素(或修改)
zadd key score1 value1 score2 value2 ...
// 获取集合中的元素个数
zcard key
// 获取集合中制定权重范围的元素个数
zcount key score1 score2
// 增量递增集合中某个元素的权重
zincrby key increment value
// 以权重为排序返回特定权重区间的值和对应的权重
zrangebyscore key score0 score1 withscores
// 查询特定元素的排名(通过权重排序)
zrank key value
// 删除集合中指定元素
zrem key value0 value1 ...
// zrembyscore key score0 score1
删除指定权重区间的元素
// 查询指定权重区间的元素和权重「升序」 
zrevrange key score0 score1 withscores
// 查看指定元素的排名「升序」
zrevrank key value
// 查询指定成员的权重
zscore key value
// 区两个集合的并集并且存放在第三个集合中
zunionstore key3 2 key1 key2

二.数据类型实现概述

1.string、list、hash、set、zset的底层数据结构
  1. string的底层基于字节数组(长度以范型T修饰,可被初始化为byte或short,以节约空间),其字符串的大小是可变的,类似于Java中的ArrayList
  2. list的底层是一个双向链表,类似Java中的LinkedList
  3. hash的底层是数组+链表,采用拉链法解决冲突,类似Java中的HashMap
  4. set的底层是hash,set的值即为hash的key,所以不能重复
  5. zset的底层是跳表,当数据量少于128个时,通过压缩链表形式存储
2.string的扩容操作

string会在创建时分配一个最大容量capacity,当当前数量len要大于capacity时,会进行扩容操作:

  1. 当字符串大小 < 1MB 时,每次成倍扩容
  2. 当字符串大小 >= 1MB 时,每次以1MB为增量扩容,最大不能超过512M
    (为了节约空间,字符串大小不同时会采用不同的格式存储)
3.hash的拉链法、渐进式rehash、双hashtable

hash的设计十分巧妙,它在扩容时,不像HashMap那样全量rehash,将所有的index重新计算哈希值和新索引值放入新数组中,而是通过渐进式rehash来达到性能优化的目的:在hash结构中存在两个haashtable,一个是旧的,一个是新的。在发生扩容时,会先将一部分rehash到新的hashtable中,而其他部分仍保留在旧hashtable中,剩余的数据将被定时器转移或在之后的操作中再逐步将其转移到新的哈希表

4.zset为什么采用跳表作为底层实现

因为zset必须保证有序,那么有两种方案,第一种是采用有序数组,这种方案能够用二分法做到插入有序,但是考虑到需要动态扩展大小,所以不能使用数组;第二种是采用有序链表,可以动态扩展大小,但是不能够快速地找到插入点;第三种是采用跳表,它结合来有序数组快速找到插入点的优点和链表动态扩展的优点,做到来O(logn)时间复杂度即可插入数据并且使其有序

TIPS:在zset的元素数量小于128个时采用的是压缩链表作为底层数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringError

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值