Redis系列之初识入门

Redis,一个完全免费开源的缓存软件,它是使用C语言编写,基于内存的高性能key-value数据库。Redis在互联网存储技术中得到非常广泛的应用,它作为缓存中间件,能够解决互联网应用中的一些技术瓶颈,且具有使用简单,性能强悍,功能应用场景丰富的特点。

Redis优势

  • 性能优秀,基于内存读写,支持10W QPS(pipeline支持50W QPS)
  • 单进程单线程,线程安全,采用IO多路复用机制
  • 支持丰富的数据类型,支持key过期
  • 支持持久化
  • 支持主从复制,哨兵,高可用
  • 支持事务
  • 可以用作分布式锁,所有操作都是原子性的
  • 可以作为消息中间件使用,支持发布订阅

Redis与Memcache的比较(为什么使用Redis)

  • Redis原生支持集群,而Memcache不支持,需要通过第三方客户端xmemcached来完成集群
  • Redis支持持久化,而Memcache不支持,机器断电后数据就会丢失
  • Redis支持丰富的数据结构,而Memcached没有
  • 底层的通信协议不同,Redis是自己直接构建了VM机制
  • Redis的value大小是1G,而Memcached的value大小是1M
  • 性能方面:Redis使用的是单核,Memcached使用的是多核,在平均下来每核上Redis在存储小数据的时候性能比Memcached要高,但是在100k以上的数据的时候Memcached性能比Redis更好。

Redis的数据结构

Redis与memcache、mongodb一样,都是以key-value方式存储数据,但是Redis有着更为丰富的数据结构去存储数据。

Redis支持的数据结构有多种,key最大512M。 

常用的五种:String、Hash、List、Set、SortedSet。其他高级:Bitmaps、HyperLogLog、Geo、Stream

String

实现方式:String是最常用的一种数据类型,可以通过预分配冗余空间的方式来减少内存的频繁分配。普通的key/value存储都可以归为此类,value数据结构为string类型,当遇到incr、decr等操作时会转成数值型进行计算。

场景:①缓存。②计数器,利用incr和decr命令进行计数,且是原子操作,最终将结果落地到数据库。③共享用户session。

Hash

实现方式:这种数据结构显得比较单一了,value的数据结构类似于map,也就是将一个对象的各个字段转化为map的形式存储在Hash中,前提是这个对象没有嵌套其他对象类型。

应用场景:①缓存一些只有基本数据类型的对象

List

实现方式:List是按照插入顺序的有序列表,List也是常有的数据结构,value使用的List,实际上是底层c语言实现了一个双向链表,操作灵活,支持范围查询和头进尾出等等。

应用场景:①列表展示,比如关注列表、粉丝列表、文章列表、评论列表等等。②分页查询,通过Irange命令可以实现List范围查找。③消息队列,利用头进尾出的命令可以实现简单的消息队列,比如:数据的生产者可以通过Lpush命令从左边插入数据,多个数据消费者,可以使用BRpop命令阻塞的“抢”列表尾部的数据。Redis实现消息队列的缺点就是当消费者下线的时候数据会丢失。

Set

实现方式:value保存的是一个set的数据结构,set具有去重的特点,其底层内部是实现了一个key为null的hashmap,根据vlaue的hash值去重。

应用场景:①去重列表,当需要实现一个去重的列表的时候可以写进set自动就去重了。②利用去重机制实现交集并集差集,如两个好友列表一起整个交集,两个好友的共同好友就出来了。

Sorted Set

实现方式:内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。Sorted Set是有序的且去重,通过维护一个优先级(score)参数来参与排序,当写入数据的时候就排好序了,当需要实现有序且去重的列表的时候可以使用。

应用场景:①有序去重的列表,比如微博热搜榜,就是有个后面的热度值,前面就是名称;twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。② 排行榜,按照哪方面进行排名就score存储什么数据。③带权重的队列,普通消息权重是1,重要消息权重是2,排好序让任务执行。

其他高级数据结构

bitmaps

实现方式:bit数组,底层维护了一个bit类型的数组,也就是说这个数组的数据只有0或1。

应用场景:布隆过滤器

HyperLogLog

应用场景:供不精确的去重计数功能,比较适合用来做大规模数据的去重统计,例如统计 UV;

Geo

实现方式:写入人或地方的经度和纬度,作位置距离计算或者根据半径计算位置等。

应用场景:①显示附近的人或地方

Stream

实现方式:结构类似于MQ的队列,先进先出

应用场景:①存储直播平台的交互聊天信息

高级用法

Pub/Sub

功能是订阅发布,可用做简单的消息队列

Pipeline

批量处理命令,也就是在一次网络连接中批量处理命令,一次性返回全部结果,减少网络请求的开销。需要注意的是 pipeline中的命令并不是原子性执行的,也就是说管道中的命令到达 Redis服务器的时候可能会被其他的命令穿插。

Lua

Redis支持Lua脚本,因此只要支持Lua的第三方组件都可以使用Redis,如Nginx。同时对于分布式锁也可以写Lua实现。

事务

Redis提供的是不严格的事务,执行事务就是执行一串命令,当命令中有失败的命令时,不会回滚,而是会继续执行剩下的命令。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值