1、可以通过object encoding命令查询内部编码
内部编码:
string:raw int embstr(小于39)
Hash:hashtable ziplist
List:linked list ziplist
Set :hashtable intset
Zset skiplist ziplist
这样设计的有点:改进内部编码,对外的数据结构和命令没有影响;多种内部编码实现可以在不同的场景下发挥各自的优势。
Redis的单线程模型:使用了单线程架构和IO多路复用模型来实现高性能的内存数据库服务。
单线程性能高的原因:
- 纯内存访问,数据放在内存中,访问快;
- 非阻塞IO,使用epoll作为IO多路复用技术的实现,加上自身的事件处理模型将epoll中的链接 读写 关闭都转换为事件,不在网络上浪费过多的时间。
- 单线程避免了现成切换和竟态产生的消耗。
单线程模型不会同时有两个命令同时执行,没有并发问题。但是若是一个命令执行时间过长,会造成其他命令的阻塞。因为redis是面向快速执行场景的数据库。
String:
命令 set setnx setex:
SET key value含义:
将字符串值 value 关联到 key . 如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
SETEX key seconds value
将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。如果 key 已经存在, SETEX 命令将覆写旧值。
返回值:
设置成功时返回 OK 。当 seconds 参数不合法时,返回一个错误。
SETNX key value 含义: setxx,与nx相反,键必须存在才能设置成功,用户更新。
将 key 的值设为 value ,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 设置成功,返回 1 . 设置失败,返回 0 。
GETSET key value 含义:
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
当 key 存在但不是字符串类型时,返回一个错误。
返回给定 key 的旧值. 当 key 没有旧值时,也即是, key 不存在时,返回 nil 。
因为 SET 命令可以通过参数来实现和 SETNX 、 SETEX 和 PSETEX 三个命令的效果,所以将来的 Redis 版本可能会废弃并最终移除 SETNX 、 SETEX 和 PSETEX 这三个命令。
SET key-with-expire-time "hello" EX 10086 ,为key设置过期时间。
SET key-with-expire-and-NX "hello" EX 10086 NX 若是key不存在 则设置,并设置过期时间。
Setnx的应用场景,若是多个客户端同时执行setnx key value,只能有一个客户端设置成功,setnx可以作为分布式锁的一种实现方案。
批量获取命令:mset:提高开发效率,减少网络消耗
计数:
incr key.自增;decr decr 自减,incrby 自增指定数字 decrby 自减指定数字 incrbyfloat 自增浮点数
String使用场景:缓存 ,计数 ,共享session ,限速(限制发短信次数,)
Hash
Hget hset hgetall 存储结构信息。
List:列表原始有序(可通过下标获取),可重复
查询:lindex key index:获取列表指定索引下标的元素。
Lrem key count value :删除指定元素,从列表中找到等于value的元素进行删除,
Ltrim key start end :按照索引范围修建列表 ,保留list的start end之间的元素。
阻塞操作命令:blpop brpop, blpop key timeout;timeout 阻塞时间。
列表为空:timeout=3 ,客户端等3s后返回,timeout=0则一直阻塞。列表不为空 则会立即返回。
list使用场景:
消息队列:lpush +brpop 可实现阻塞队列,
文章列表:分页展示每个人的文章列表。若是列表较大,获取中间数据比较慢,可以考虑将列表做二级拆分。<