告诉大家一个联系redis的网站
http://try.redis.io
1、全局变量
redis有五种数据结构,他们是键值对中的值,对于key来说有一些通用的命令。
-
keys *:获取redis的所有键,强烈不推荐使用在实战中。O(n)
-
dbsize:键的总数。在计算键的总数不会去一一遍历,而是直接读取redis内置的键总数变量,时间复杂度O(1)
-
exists key:检查键是否存在,这个很实用,一般实战中首先先执行一下这个命令。
-
del key:删除键
-
expire key seconds:redis支持对键添加过期时间,当超过过期时间后,会自动删除键。eg:expire hello 10
-
ttl key:查看键的状态
- 大于等于0的整数,键剩余时间。
- -1:没有设置过期时间
- -2:键不存在
-
type key:键的数据结构类型
2、数据结构和内部编码
数据结构种类:string、hash、list、set、zset、bitmaps、hyperloglog
【注意】:每种数据结构底层的内部编码都有两种以上。
熟悉他们,会成为业务上的好帮手。
这两张图,形象的告诉了我们前五种基本数据结构的结构和内部编码。
我们都知道redis是单线程设计,那么问题来了,我们不是说多线程程序处理速度更快吗,那么redis的单线程是如何保证高效的?
1、纯内存访问,处理速度可以达到每秒万级别访问。
2、非阻塞IO,redis使用epoll作为IO多路复用技术实现,再加上redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在网络IO上浪费太多时间。
3、单线程避免了线程切换和竞态产生的消耗。
通用查看编码方式 object encoding key
2.1、字符串
-
命令:
-
内部编码:
int
:8个字节的长整型embstr
:<=39个字节的字符串raw
:>39个字节的字符串
-
使用场景:缓存功能、计数、共享session(分布式服务记录session)、限速(短信接口不会被频繁访问)
2.2、哈希
hash就是指一对键值对,redis下形如value={{field1,value}, {field2, value}…}
-
命令:
- hset key field value 设置值
- hget key field 获取值
- hdel key field 删除值
- hlen key 计算key下有几组数
- 批量插入和获取
- hmset key field value [ field value…]
- hmget key field [field…]
- hexist key field 判断field是否存在
- hkeys key 获取所有field
- hvals key 获取所有value
- hgetall key 获取所有filed -value, 甚用会阻塞redis。
- hstrlen key field 获取value的字符串长度
-
内部编码:
哈希内部编码有两种ziplist
和hashtable
ziplist(压缩列表):实现多个元素连续存储,结构更加紧凑,占用内存更小,当哈希元素个数小于配置的hash-max-ziplist-entries的值,且value的每个值的长度都小于hash-max-ziplist-value时使用。
hashtable(哈希表):当无法满足ziplist的条件时,会使用hashtable,因为此时ziplist的读写效率会下降,hashtable的时间复杂度是O(1)。
这里有更加详细的讲解,对两种编码实现 -
使用场景:
用户信息,关系型数据库使用行记录数据,如果我们使用redis的hash结构存储用户信息会比字符串更加紧凑直观,而且便于更新操作可以将多个用户的id定义为key后缀,field-value记录用户信息。
对于缓冲用户信息我们有三种方式
1、 使用原生的字符串:每个属性一对键值,简单直观,每个键都可以直接更新,但是键比较松散,占用过多的键,占用内存较多。
2、 序列话字符串:比原生字符串信息更集中,提高内存的使用率,但是序列化和反序列化带来一定的开销
3、 使用hash存储:简单直观,在控制好编码方式的情况下可以大大减少内存的使用。
2.3、列表
列表用来存放多个连续有序的字符串
,可以当做队列和栈使用。
一个列表最多可以存放2^23 -1个元素。
列表有两个特点
第一:元素是有序的,这就意味着可以通过索引获取某个元素或者范围内的元素列表。
第二:列表中的元素是可以重复的。
- 命令:
操作类型 | 命令 |
---|---|
添加 | rpush、lpush、linsert |
查 | lrange、llen、lindex |
删除 | lpop、rpop、ltrim、lrem |
修改 | lset |
阻塞操作 | blpop、brpop |
- 内部编码:
- ziplist(压缩列表):实现多个元素连续存储,结构更加紧凑,占用内存更小,当哈希元素个数小于配置的hash-max-ziplist-entries的值,且value的每个值的长度都小于hash-max-ziplist-value时使用。
- linkedlist(链表):当列表类型无法满足ziplist的条件时,redis会使用linkedlist作为列表的内部实现。
- 使用场景:
消息队列:redis的lpush+brpop 命令组合使用就可以实现阻塞列。
2.4、集合
-
命令:
-
内部编码:
-
使用场景:
2.5、有序集合
- 命令:
- 内部编码:
- 使用场景:
2.6、键管理
1、键重命名:rename key newkey
注意:要是rename前key存在,怎rename后的值也会被覆盖
为了防止这种情况发生,redis提供了renamenx,确保只有newKey不存在的时候才覆盖。
2、随机返回一个键
randomkey
3、键过期