Redis提供了5种基本的数据类型,本章节及后面几个章节主要介绍如下内容:
- 了解全局命令
- 各数据结构特点和编码、命令使用。
1 全局命令
2 string
Redis的基本数据类型。String的值可以使字符串、数字甚至是二进制,但是最大不能超过512M。
(1)常用命令
- set get mset mget 设置和获取值,单个与批量。
如:#set hello world
#mset a 1 b 2
- incr decr incrby decrby 原子加减操作,带有by的可以指定原子加减的数值。
如:#incr a
#incrby a 2
- setnx msetnx 单个和批量的原子设置值操作。如果指定的Key不存在,则设定该Key持有指定字符串Value,此时其效果等价于SET命令。相反,如果该Key已经存在,该命令将不做任何操作并返回。
- getset 原子设置获取
- strlen append getrange setrange 截取或者设置部分字符串。
语法:#strlen key, append key value, getrange key start end , setrange key offset value
- setex 原子设置值并且设置有效时间。
语法:#setex key seconds vaule
- 内部编码
String类型的内部编码主要有以下3种,redis会根据当前值的类型决定使用哪种内部编码:
- int: 8个字节的长整形。
- embstr:<=39 bytes
- raw: >39 bytes
3. bitmaps
Bitmaps 本身不是一种数据结构,实际上它就是string,但是他可以对字符串的bit进行操作,常用命令为:
- SETBIT 设置或清除指定偏移量上的bit: setbit key offset value
- getbit 获取指定偏移量上的bit: getbit key offset
- bitcount 计算给定字符串中,被设置为 1 的比特位的数量: bitcount key [start] [end]
- bitop 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上: bitop operation destkey key [key ...]
operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种:
•AND ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
•OR,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。
•XOR,对一个或多个 key 求逻辑异或,并将结果保存到 d estkey 。
•NOT,对给定 key 求逻辑非,并将结果保存到 destkey 。
4. 应用场景
缓存功能:字符串最经典的使用场景,redis作为缓存层,Mysql作为存储层,绝大部分请求数据都是redis中获取,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低后端压力的作用。
计数器:许多应用都会使用redis作为技术的基础工具,他可以实现快速技术、查询缓存的功能,同时数据可以一步落地到其他的数据源。
如:视频播放数系统就是使用redis作为食品播放数计数的基础组件,用户每播放一次视频,使用string的incr命令将相应的视频播放数自增1。
共享session:一个分布式web服务将用户的session信息保存在各自服务器中,这样会造成一个问题,处于负载均衡的考虑,分布式访问会将用户信息的访问均衡到不同服务器上,用户刷新一次访问可能会需要重新登录,这个问题是用户无法容忍的,为避免这个问题可以用redis将用户session集中管理,在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息都直接从redis中集中获取。
分布式锁:利用setnx命令实现。
限速:很多应用处于安全的考虑,会在每次进行登录时,让用户输入手机验证码,为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率,如一分钟不得超过5次,利用“set key value EX 60 NX”命令设置key的过期时间为60s,并且只有在key不存在的时候设置成功,在key的有效时间内再利用incr记录发送次数,从而实现限速的功能。还有些网站限制一个IP地址不能再一秒钟之内访问超过n次也可以用类似的思路