Redis学习笔记 ——(2)全局命令、数据结构和内部编码、字符串及其应用场景
1. 全局命令
首先了解一下redis常用的全局指令。
- keys *
查看存在的所有键,可以先通过set方法设置几个key,然后通过keys * 就可以看到当前所有的key。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set name zhangshan
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> keys *
1) "name"
2) "hello"
- dbsize
键总数,可以看懂啊当前存在多少键。
127.0.0.1:6379> dbsize
(integer) 2
- exists key
查看键是否存在,如果键存在咋返回1,不存在则返回0.
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists h
(integer) 0
- dele key []
删除键
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> exists hello
(integer) 0
- expore key seconds
给键添加过期时间,当超过设定的时间之后,会自动删除该键。 - type key
查看键的数据结构类型
127.0.0.1:6379> set string_key "string_key_value"
OK
127.0.0.1:6379> type string_key
string
2. 数据结构和内部编码
全局命令中的type返回的就是当前键的数据结构类型,他们分别是string(字符串)、hash(哈希)、list(字列表)、set(集合)、zset(有序集合),但这些只是redis对外的数据结构。
127.0.0.1:6379> get hello
"stirng"
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> set hellos 123
OK
127.0.0.1:6379> object encoding hellos
"int"
可以看到hello对应的值的内部编码是embstr, 而hello对应的内部编码格式为int。
Redis这样设计有两个好处:
第一可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构狗和命令,例如Redis3.2提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现,而对外部用户基本感知不到。
第二是多种内部编码实现可以再不同场景下发挥各自的优势,例如ziplist比较节省内存,但是再列表元素比较多的情况下,性能有可能会有所下降,这种时候redis会根据配置选项将这些列表类型的内部实现转换为linkedlist。
3.单线程架构
交互模型
Redis客户端于服务端请求的过程分为三步:
1.客户端发送命令到服务端
2.服务端执行命令
3.服务端返回结果
为什么单线程还能这么快
通常来说,单线程处理能力要比多线程查,例如有10000斤的货物,每辆车的运载能力是200斤,就要运50次,但是如果有50辆车,一次就可以完成,而redis可的单线程模型可以达到每秒万级别的处理能力的有以下三点。
- 纯内存访问,Redis将所有的数据都放在内存中,内存的相应时长大约位100纳秒,这是Redis达到每秒万级别访问的重要基础。
- 非阻塞I/O,Redis使用epol作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不再网络I/O上浪费过多的时间。
- 单线程避免了县城切换和静争产生的消耗。
1.字符串
字符串类型是redis嘴基础的数据结构,首先键都是字符串类型,而其他几种数据结构都是在字符串基础上构建的。
字符串类型的值实际上可以是字符串、数字、二进制等,但是最大不能超过521MB。
常用的命令
1 SET key value
设置指定 key 的值。
2 GET key
获取指定 key 的值。
3 GETRANGE key start end
返回 key 中字符串值的子字符
4 GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5 GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
6 MGET key1 [key2..]
获取所有(一个或多个)给定 key 的值。
7 SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8 SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
9 SETNX key value
只有在 key 不存在时设置 key 的值。
10 SETRANGE key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11 STRLEN key
返回 key 所储存的字符串值的长度。
12 MSET key value [key value ...]
同时设置一个或多个 key-value 对。
13 MSETNX key value [key value ...]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14 PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15 INCR key
将 key 中储存的数字值增一。
16 INCRBY key increment
将 key 所储存的值加上给定的增量值(increment) 。
17 INCRBYFLOAT key increment
将 key 所储存的值加上给定的浮点增量值(increment) 。
18 DECR key
将 key 中储存的数字值减一。
19 DECRBY key decrement
key 所储存的值减去给定的减量值(decrement) 。
20 APPEND key value
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。
内部编码
字符串类型的内部编码有三种:
- int :8个 字节的长整型
- embstr: 小鱼等于38个字节的字符串
- raw: 大于39个字节的字符串
redis会根据当前值的类型和长度决定使用哪种内部编码实现。
应用场景
- 缓存功能
系统架构的设计当中,通常会在web服务和存储层之间加一个存储层,当用户查询一次信息之后就将信息放在缓存区,当用户再次进行访问的时候,会优先再缓存层去查询,如果没有存在则去存储层查询并增加到缓存层,这样可以大大的减轻存储层的压力。 - 计数
许多应用会使用Redis作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同事数据可以异步落地到其他数据源。
-共享session
一个分布式web服务如果将所有的用户登录状态信息存储在服务器中,会导致数据量较大,响应速度慢等问题,Redis可以将用户的session进行集中管理,每次用户更新活着查询登录信息都直接从Redis中集中获取。
- 限速
很多应用出于安全的考虑,在每次登陆前需要输入验证码,但是为了短信接口不被频繁的访问,可以限制用户每分钟获取验证码的频率,例如一分钟只能1次。