redis是什么? redis是内存数据库,数据存储在内存中,读写速度很快,广泛应用于缓存。 (Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的,是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。)
redis较memcached优势? redis不仅支持简单的k/v(string),还支持丰富的数据类型,例如 list set hash zset . redis支持数据的持久化,可以将内存中的数据保存在磁盘中,因此具有灾难恢复机制。 redis原生地支持集群模式。 redis在服务器内存使用完之后,可以把不用的数据存到磁盘中。 redis单线程,多路io复用。 redis支持发布订阅模型、lua脚本、事务等功能。 redis对过期的数据使用惰性删除和定期删除。
为什么要用缓存(redis)? 为了获取高性能和高并发:提升用户体验(高性能),应对更多的用户请求(高并发) 高性能:将用户经常访问并且不会经常改变的数据存入缓存中,用户请求从缓存中直接获取数据,比从数据库中速度快。但是要保持数据库和缓存数据的一致性,数据库中的数据发生更改时,缓存中的数据要同步更新。 高并发:一般4C8G 的mysql数据库服务器的qps(query per seconds)在1w左右,而redis服务器的qps通常可以达到10w+。将一部分数据存入缓存中,则系统能够承受更多的请求数量,提高系统并发性能。
缓存数据的处理流程? 如果用户请求的数据在缓存中能够找到,就返回缓存数据; 缓存中不存在,就去数据库中查找; 如果数据库中存在,将数据返回给用户,并更新缓存数据(存入高频访问数据); 如果数据库中不存在,返回null。
redis除了缓存还有哪些功能? 分布式锁 分布式锁中的王者方案 - Redisson 限流 redis+lua脚本实现限流 redis分布式限流器 消息队列 复杂业务场景 比如 利用bitmap统计活跃用户,通过sorted set维护排行榜。
redis常见数据结构以及使用场景分析: string: 结构:简单动态字符串SDS。是二进制安全的,可以保存二进制数据,并且是安全的,不会造成缓冲区溢出,获取字符串长度的复杂度为O(1)。 场景:用于需要计数的场景。比如 用户的访问次数,热点文章的点赞转发数量。 计数器:字符串为整数时可以使用。incr 加一; decr 减一 。 过期:数据默认永不过期。ttl 返回结果 -1代表永不过期 expire key seconds 设置过期时间; setex key seconds value 设置过期时间与key value; ttl key 查看过期时间
list: 字符串列表 结构:双向链表。对于首尾节点的操作效率较高,对于中间节点的操作效率较低。对比数组,易于插入删除,但是随机访问困难。 应用场景:发布与订阅 简单消息队列 慢查询。 实现队列:lpush + rpop 实现栈:lpush + lpop 实现分页查询:lrange key start stop start开始下标 stop结束下标; 0 ~ -1表示查询所有元素
hash: redis - hash 结构:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。 哈希表由 数组+链表 实现。 hash是String类型的field和value映射表,特别适合用于存储对象。redis本身就是key:value存储方式 , 此时的hash作为redis中value的一种类型。 应用场景:存储对象、购物车、计数器
set: Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构内部也使用hash结构(哈希表),所有的value都指向同一个内部值。 set适用于存储无序、不可重复的列表数据,并且提供了查询某个元素是否在set中的接口,可以方便计算两个set的交集、并集、差集等操作。 应用场景:需要存的数据不可重复且无序、需要获取多个数据源的交集 并集等。sismember sinterstore suion
sorted set: 结构:哈希表 + 跳表(用于有序链表的快速查找,给原始链表建立多层索引链表,类似有序数组的二分查找 跳表) 和set相比,zset多了一个权重score,每一个元素都对应一个score,使用哈希表存储(key = 元素的value; value = score)。 根据score对列表元素进行排序,并且可以查找指定score范围的元素列表。 zset适用于存储有序、不可重复的列表数据。 但是评分score可以重复。 应用场景:需要根据某个权重对元素进行排序的场景。比如排行榜。需要较多查找请求。 zscore key member 查看某个元素的分数 zrange key start stop 按照添加的索引查找列表 zrangebyscore key min max 按照分数正序查找列表 zrevrangebyscore key max min 按照分数逆序查找列表
bitmaps: bitmaps本身是字符串,但是可以对字符串的二进制位进行操作。可以通过bitmap,仅使用一个bit位来表示某个元素的值或状态。节约空间且高效。 可以将bitmap看做二进制位的数组,其value只存储0和1,bitmap中的偏移量offset可以看做数组的下标。 应用场景:需要保存用户状态信息,并需要进一步对这些信息进行分析的场景。例如:用户签到情况、活跃情况、行为统计等。 setbit key offset value value默认是0 记录视频video007的点赞用户 setbit video007 userId 1 记录用户的在线状态 setbit online userId 1
# 对一个或多个 二进制位字符串 key 进行位元操作,并将结果保存到 destkey 上。
# BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作operation中的任意一种参数
BITOP operation destkey key [key ...]
比如需要获取多个bitmap的交集、并集等场景,例如统计某个时间段(每天都有一个bitmap统计用户在线状态)内每天都上线(取每天bitmap的交集)的用户。
为什么要用分布式缓存? 单机缓存的容量受服务器限制,并且单机缓存无法共享缓存数据,因此需要分布式缓存。 (本地缓存只在当前服务里有效,多个服务之间无法共享缓存数据。)
参考 javaguide-redis
|