57.谈谈你对redis的理解,redis的五种数据类型的应用场景
redis是一款高性能的NOSQL系列的非关系型数据库。
内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化
1) 字符串类型 string ( string)
常常用来做计数器这类自增自减的功能,可用在粉丝数、微博数等。
2) 哈希类型 hash ( map格式 )
适合存储对象类型信息,例如个人信息、商品信息等
3) 列表类型 list (linkedlist格式。支持重复元素)
可以添加一个元素到列表的头部(左边)或者尾部(右边)
应用场景可以有微博的关注列表、粉丝列表、消息列表等
4) 集合类型 set ( 不允许重复元素)
适合做共同好友等功能
5) 有序集合类型 sortedset 不允许重复元素,且元素有顺序
每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
redis的应用场景
• 缓存(数据查询、短连接、新闻内容、商品内容等等)
• 聊天室的在线好友列表
• 任务队列。(秒杀、抢购、12306等等)
• 应用排行榜
• 网站访问统计
• 数据过期处理(可以精确到毫秒
• 分布式集群架构中的session分离
String
String类型是最基础的一种key-value存储形式,value其实不仅仅可以是String,也可以是数值类型。常常用来做计数器这类自增自减的功能,可用在粉丝数、微博数等。
常用命令:
1、set/get
1)设置key对应的值为String类型的value
2)获取key对应的值
2、mget
批量获取多个key的值,如果可以不存在则返回nil
3、incr && incrby
incr对key对应的值进行加加操作,并返回新的值;incrby加指定值
4、decr && decrby
decr对key对应的值进行减减操作,并返回新的值;decrby减指定值
5、setnx
设置key对应的值为String类型的value,如果key已经存在则返回0
6、setex
设置key对应的值为String类型的value,并设定有效期
7、其他命令
1)getrange 获取key对应value的子字符串
2)mset
批量设置多个key的值,如果成功表示所有值都被设置,否则返回0表示没有任何值被设置
3)msetnx,同mset,不存在就设置,不会覆盖已有的key
4)getset 设置key的值,并返回key旧的值
5)append
给指定key的value追加字符串,并返回新字符串的长度
List
list就是链表,在redis实现为一个双向链表,可以从两边插入、删除数据。应用场景可以有微博的关注列表、粉丝列表、消息列表等。
有一个lrange函数,可以从某个元素开始读取多少个元素,可用来实现分页功能。
常用命令:lpush、rpush、lpush、 lpop、lrange
Hash
hash就是值类型存储的是一个键值对形式,适合存储对象类型信息,例如个人信息、商品信息等。
常用命令 hset hmset hget hgetAll
Set
set表示存储的一个元素不重合的集合,因为set集合支持查缉、并集操作,因此适合做共同好友等功能
示例
常用命令 sadd spop smembers sunion sinter
Sorted Set
相对于Set,Sorted Set多了一个Score作为权重,使集合里面的元素可以按照score排序,注意它是Set,所以它里面的元素也不能重复
示例
常用命令 zadd zpop zrangeByScore
redis事务与传统关系型事务的比较
redis务ACID
1、 原子性(Atomicity)
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
如果一个事务队列中的所有命令都被成功地执行,那么称这个事务执行成功。
2、 一致性(Consistency)
入队错误
在命令入队的过程中,如果客户端向服务器发送了错误的命令,比如命令的参数数量不对,等等, 那么服务器将向客户端返回一个出错信息, 并且将客户端的事务状态设为 REDIS_DIRTY_EXEC 。
执行错误
如果命令在事务执行的过程中发生错误,比如说,对一个不同类型的 key 执行了错误的操作, 那么 Redis 只会将错误包含在事务的结果中, 这不会引起事务中断或整个失败,不会影响已执行事务命令的结果,也不会影响后面要执行的事务命令, 所以它对事务的一致性也没有影响。
3、隔离性(Isolation)
WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。
4、持久性(Durability)
因为事务不过是用队列包裹起了一组 Redis 命令,并没有提供任何额外的持久性功能,所以事务的持久性由 Redis 所使用的持久 化模式决定