因为一次redis缓存穿透,全面探究redis能做什么( 二 )


由此可以总结 , redis有以下几特性:

  • 内存存储 , 支持更丰富的数据类型
  • Zset数据结构可以用来做排行榜 , Zset是一种排序的set集合 , 可以快速定位到top N
  • 利用set集合的一些命令 , 可以获取好友关系 , 比如求交集、并集、差集等 。
  • 支持持久化(rdb、aof):RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储;AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写 , 使得AOF文件的体积不至于过大 。
  • 发布订阅 , 可以用作队列 , list的push和pop可以实现简单的队列或栈结构 。 比如lpush从左边插入 , lpop从左边取 , 就是后进先出的一种栈结构;如果lpush进入 , rpop出去 , 又是队列结构 。

因为一次redis缓存穿透,全面探究redis能做什么文章插图
因为一次redis缓存穿透,全面探究redis能做什么文章插图
  • 地图分析geospatial
GEOADD添加经纬度
GEODIST计算两个城市间距离 , 可以指定单位千米或者英尺
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"(integer) 2redis>。Sicily Palermo Catania"166274.15156960039"redis> GEODIST Sicily Palermo Catania km"166.27415156960038"redis> GEODIST Sicily Palermo Catania mi"103.31822459492736"redis> GEODIST Sicily Foo Bar(nil)redis>
  • 计时器、计算器/限速器 , 利用Redis中原子性的自增操作 , 我们可以统计类似用户点赞数、用户访问数等 , 这类操作如果用MySQL , 频繁的读写会带来相当大的压力
  • 主从复制-哨兵模式
  • 分布式锁
/*** 加锁* @param key redis key* @param expire 过期时间 , 单位秒* @return true:加锁成功 , false , 加锁失败*/publicboolean lock(String key, int expire) {byte [] byteKey = fst.serialize(DEFAULT_CACHE_NAME+ "_" +key);byte [] byteVal = fst.serialize("1");long status = jedisCluster.setnx(byteKey, byteVal);//1.setnx , 成功返回1失败返回0if(status == 1) {//2.返回结果为1 , 设置超时时间 , 加锁成功jedisCluster.expire(byteKey, expire);return true;}//3.返回结果为0 , 加锁失败return false;}Redis为什么能做这些上面说了Redis的一些使用场景 , 那么这些场景的解决方案也有很多其它选择 , 比如缓存可以用Memcache , Session共享还能用MySql来实现 , 消息队列可以用RabbitMQ , 我们为什么一定要用Redis呢?
【因为一次redis缓存穿透,全面探究redis能做什么】那是因为Redis执行速度快:
速度快 , 完全基于内存;
使用C语言实现 , 网络层使用epoll解决高并发问题;
单线程模型避免了不必要的上下文切换及竞争条件;
注意:单线程仅仅是说在网络请求这一模块上用一个请求处理客户端的请求 , 像持久化它就会重开一个线程/进程去进行处理 。
#Redis#


推荐阅读