Redis

redis为什么快
因为redis是基于内存操作。并且6.0版本之前的redis是单线程的,可以省去很多线程间的切换时间,避免多线程对性能上的消耗。redis的IO多路复用处理并发类问题:redis利用epoll来实现多路复用,先将链接信息和事件放到队列中,然后依次放到文件事件分配器中,然后事件分配器再分给事件处理器。
redisson分布式锁实现原理
使用redisson加锁,三步:1、调用redisson.getLock(lockKey)获取你自己定义的这个lockKey的锁对象。2、加锁:redisson.lock(),在try中。3、redisson.unlock()释放锁。在finally中。
业务流程:redisson底层是用setNx命令,核心加锁代码是tryLockInnerAsync方法,是用lua脚本写的。if逻辑中,先通过exists命令判断这个key存不存在,不存在就把它hset进去,设置key,value和超时时间,默认是30s(可以通过配置修改),lua脚本在redis中执行相当于一条命令,所以具有原子性;key存在则返回循环等待。并且在执行过程中有一段定时线程任务以递归的方式保证锁续命。
主从架构中如果要保证可用性的话可以采用redlock实现。redlock底层实现类似于zookeeper,加锁时要同时对多个节点保证加锁成功,并且还不是很成熟,性能也差不推荐使用。
并且高并发下,redis可以以分段加锁的方式保证性能上的提升(类似于hashmap)。
分布式锁还可以解决缓存数据库双写不一致问题。

redis的5中类型及其原理

String
String类型底层又分为:int、raw(大字符串长度大于44)、embstr(小字符串长度小于44),可以用命令encoding key 查看,且int类型的可以用incr和decr原子递增和递减。至于其他命令,可以参考redis官方命令规范。String类型应用场景:常规的单值缓存或者对象缓存都可以用String,基于get、set(key,value)是比较简单且常用的缓存类型。并且SETNX可以实现分布式锁。
Hash
hash常用操作为:hset key field value;hget/hdel key field等。底层数据结构为ziplist和hashtable(当hash对象保存的键值对数量少于512或键值的字符串长度都小于64时是ziplist类型)。hash类型的优点:比String更节省空间,同类数据归类整合存储,更加便于数据管理。缺点:过期功能不能使用在field上,只能在key上;并且hash类型在集群架构下不适用。应用场景:电商购物车。
List
list的结构为LPUSH/RPUSH(从左/右一次存入),LPUP/RPUP(从左/右依次取出),LRANGE msg m n(从左取出m-n范围的数据)等。底层数据结构:压缩列表ziplist和双向链表linkedList(跟hash一样,当满足一定条件时ziplist会转化为LinkedList)。应用场景:微信和公众号消息流,因为list存入是依次存入的,所以取得时候也是依次有序取出(可以很好的用来排序)。
set
set底层数据结构为intsett数组和hashtable(当对象保存的所有元素都是整数值时或者集合对象总数小于512时是intset类型)。set常用操作:SADD key member [member…](往集合key中存入元素 )等。而set有很多取交集、并集、差集等运算(SINTER、SUNION、SDIFF)。利用这些可以把set用于抽奖、朋友圈点赞、关注和一些筛选相关的场景。<

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值