redis的常用数据类型及操作
概述
redis是基于内存的非关系型数据库,采用单线程的方式进行访问,得益于纯内存操作、单线程(避免线程切换损耗)、io多路复用技术等,响应时间非常快,每秒可达到万级别的访问量。
redis常用的数据类型有5种,如下:
1、string(字符串:所有其他类型的基础)
- 字符串的类型的value可以是字符串(简单的字符串或者复杂json等)、数字(整型或者浮点类型)、二进制(文件、图片、音视频等),最大不超过512MB
- 常用的操作命令:
- set key value (插入值)
- get key (获取值)
- mset key value (批量插入值,多个key value中间以空格隔开)
- mget key(批量获取key,多个key中间以空格隔开)
- incr key(自增整数类型的值)
- decr key(自减整数类型的值)
- setnx key value (如果key不存在就插入返回1,已经存在就返回0;可以利用redis单线程的特性结合setnx命令的特性做分布式锁)
- 使用场景:
- 可以做数据库前的缓存层,降低数据库访问压力,提升程序响应速度
- 分布式系统中管理用户状态,做共享session
- 分布式锁等
2、hash(哈希:存储键值对,类似于map)
- hash的值本身也是key value形式的键值对,可以存一些较为复杂的数据
- 常用命令:hset key field value(插入hash值)
- hget key field (获取值)
- hdel key field (删除值)
- hmget key field(批量获取值 多个field之间空格隔开)
- hmset key field value(批量插入值 多个field之间空格隔开)
- 应用场景:存储一些复杂的数据,例如:学生的姓名、年龄、分数
3、list(列表:存储有序可以重复数据)
- list存储多个字符串,元素是有序且可以重复的,可以通过下标获取具体的某个值
- 常用命令:
- lpush key value (从左往右插入)
- rpush key value (从右往左插入)
- linsert key before|after pivot value (向某个元素前或者后插入元素 )
- lrange key start end(根据开始和结束下标获取值,包括开始和结束下标本身)
- lindex key index (获取指定下标的值)
- llen key (获取列表长度)
- lpop key (从左侧弹出元素)
- rpop key (从右侧弹出元素)
- lrem key count value(删除指定元素 ,count为元素个数:0代表全部,负值代表从右侧开始)
- ltrim key start end (按照索引范围修剪列表,包含开始和结束下标位置的元素)
- lset key index newvalue (修改指定索引下标的元素)
- brpop blpop key timeout(阻塞弹出操作,1 列表为空:如果timeout=3,那么客户端要等到3s后返回,如果1.timeout=0,客户端则阻塞等下去,如果添加了数据,客户端立刻返回;列表不为空:客户端立即返回)
- 使用场景:利用brpop blpop的阻塞操作作为消息队列使用
- lpush+lpop=Stack(模拟栈使用)
- lpush+rpop=Queue(模拟队列)
- lpsh+ltrim=Capped Collection(有限集合)
- lpush+brpop=Message Queue(消息队列)
4、set(集合:存储无序不可重复数据)
- set集合存储无序的数据,元素不可以重复
- 常用命令
- 集合内操作
- sadd key element (添加元素)
- srem key element(删除元素)
- scard key (计算元素个数)
- sismember key element(判断元素是否在集合中)
- srandmember key (随机从集合返回指定个数元素)
- spop key(从集合随机弹出元素)
- smembers key (获取所有元素)
- 集合间操作
- sinter key (求多个集合的交集)
- suinon key (求多个集合的并集)
- sdiff key (求多个集合的差集)
- 将交集、差集、并集结果保存
- sinterstore destination key
- sdiffstore destination key
- suionstore destionation key
- 使用场景:
- 给用户添加标签
sadd user:1:tags tag1 tag2 - 给标签添加用户
sadd tag1:users user:1 user:3
(提示:用户和标签的关系维护应该在一个事务内执行,防止部分命令失败造成的数据不一致) - 删除用户下的标签
srem user:1:tags tag1 tag5 - 删除标签下的用户
srem tag1:users user:1 - 计算用户共同感兴趣的标签
sinter user:1 tags user:2 tags
5、zset(有序集合:存储无序不可重复数据,通过设置score来实现排序)
- 有序集合就是在集合之上加了个score作为排序的依据
- 常用命令:
- zadd key score value(score为序号值,value为值,zadd和sadd相比增加了排序,同时时间复杂度也增加)
- zcard key (计算元素个数)
- zscore key member (计算某个成员的分数)
- zrank key member (计算成员的排名)
- zrem key member (删除成员)
- zincrby key increment member (增加成员的分数)
- zrange key start end (返回指定排名范围的成员)
- zrangebysore key min max (返回指定分数范围的成员)
- zcount key min max (返回指定分数范围成员个数)
- zremrangebyrank key start end (删除指定排名内的升序元素)
- zremrangebyscore key min max (删除指定分数范围的成员)
- zinterstore destination numkeys key (计算交集)
- zunionstore destionation numkeys key (计算并集)
- 使用场景:
利用zset可以排序的特性做排行榜
6、redis通用命令
- keys * (匹配获取所有key)
- rename key newkey(重命名key)
- expire key “seconds” (设置key的过期时间,单位:秒,返回1表示设置成功,返回0则设置失败或者key不存在)
- ttl key (获取过期时间)
- CONFIG get requirepass (获取密码验证,如果为空就不需要认证)
- CONFIG set requirepass “ying” (设置密码认证为ying)