redis总结

一、Redis简介

Redis是当前比较热门的NOSQL系统之一,是一个开源(BSD许可)的,使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,Redis数据都是缓存在计算机内存中,不同的是,Memcache只能将数据缓存到内存中,无法自动定期写入硬盘,这就表示,一断电或重启,内存清空,数据丢失。所以Memcache的应用场景适用于缓存无需持久化的数据。而Redis不同的是它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,实现数据的持久化。
二、Redis中KEY
TYPE
数据类型(strings:字符串,hashes:散列,lists:列表,sets:集合,sorted sets:有序集合)
TTL
持续时间(单位:秒)
KEY的生命周期与测试
用户可以自定义一个时间,时间到期,键值被自动销毁,效果与使用DEL命令是一样的
1.我们可以利用的精度单位是秒或者毫秒
2.失效时间使用的精度单位是1毫秒
3.Redis的失效时间,与Redis服务是否停止没有联系,这个时间会复制到硬盘上,并由硬盘保证时间的精准,换句话说,即使redis服务没停止了,到了某个键的失效时间的时候,这个键也是要失效的。
Redis可以通过给key指定一个生存时间(秒/毫秒),当key过了这个生存时间后Redis将自动删除这个key。在一些特殊的场景下面非常有用,下面我们介绍expire、expireat、pexpire、pexpireat四个命令,其中expire和expireat单位是秒;pexpire和pexpireat是毫秒。
expire、expire at、p expire、 p expire at
仔细观察这四个命令全部是在expire单词的前面后后面加或不加东西。如果在前面加【p】,则表示已毫秒为单位,如果在后面加【at】,则表示用于unix时间戳。
注:可以用连接器链接redis进行查看和操作
下载RedisDesktopManager
官网下载地址:https://redisdesktop.com/download
2、连接到Redis服务端
3、工作台
4、查看KEY
三、测试过程中Redis常用命令
所有命令相关链接:http://doc.redisfans.com/index.html
四、Redis使用场景
特点:
一个产品的使用场景肯定是需要根据产品的特性,先列举一下Redis的特点:
读写性能优异、持久化、数据类型丰富、单线程、数据自动过期、发布订阅、分布式、高性能适合当做缓存
场景:
1、缓存
缓存是Redis最常见的应用场景,主要是因为Redis读写性能优异。而且逐渐有取代memcached,成为首选服务端缓存的组件。而且,Redis内部是支持事务的,在使用时候能有效保证数据的一致性。
作为缓存使用时,一般有两种方式保存数据:
1)、读取前,先去读Redis,如果没有数据,读取数据库,将数据拉入Redis。
2)、插入数据时,同时写入Redis。
方案一:实施起来简单,但是有两个需要注意的地方:
1)、避免缓存击穿。(数据库没有就需要命中的数据,导致Redis一直没有数据,而一直命中数据库。)
2)、数据的实时性相对会差一点。
方案二:数据实时性强,但是开发时不便于统一处理。
当然,两种方式根据实际情况来适用。如:方案一适用于对于数据实时性要求不是特别高的场景。方案二适用于字典表、数据量不大的数据存储。
丰富的数据格式性能更高,应用场景丰富
Redis相比其他缓存,有一个非常大的优势,就是支持多种数据类型。
数据类型说明:
string(字符串,最简单的k-v存储)
hash(hash格式,value为field和value,适合ID-Detail这样的场景。)
list(简单的list,顺序列表,支持首位或者末尾插入数据)
set(无序list,查找速度快,适合交集、并集、差集处理)
sorted set(有序的set)
其实,通过上面的数据类型的特性,基本就能想到合适的应用场景了。
string——适合最简单的k-v存储,类似于memcached的存储结构,短信验证码,配置信息等,就用这种类型来存储。
hash——一般key为ID或者唯一标示,value对应的就是详情了。如商品详情,个人信息详情,新闻详情等。
list——因为list是有序的,比较适合存储一些有序且数据相对固定的数据。如省市区表、字典表等。因为list是有序的,适合根据写入的时间来排序,如:最新的***,消息队列等。
set——可以简单的理解为ID-List的模式,如微博中一个人有哪些好友,set最牛的地方在于,可以对两个set提供交集、并集、差集操作。例如:查找两个
人共同的好友等。
Sorted Set——是set的增强版本,增加了一个score参数,自动会根据score的值进行排序。比较适合类似于top 10等不根据插入的时间来排序的数据。
如上所述,虽然Redis不像关系数据库那么复杂的数据结构,但是,也能适合很多场景,比一般的缓存数据结构要多。了解每种数据结构适合的业务场景,不仅有利于提升开发效率,也能有效利用Redis的性能。
2、分布式和持久化有效应对海量数据和高并发
Redis初期的版本官方只是支持单机或者简单的主从,大多应用则都是自己去开发集群的中间件,但是随着应用越来越广泛,用户关于分布式的呼声越来越高,所以Redis 3.0版本时候官方加入了分布式的支持,主要是两个方面:
Redis服务器主从热备,确保系统稳定性
Redis分片应对海量数据和高并发
而且Redis虽然是一个内存缓存,数据存在内存,但是Redis支持多种方式将数据持久化,写入硬盘,所有,Redis数据的稳定性也是非常有保障的,结合Redis的集群方案,有的系统已经将Redis当做一种NoSql数据存储来适用。
示例:秒杀和Redis的结合
秒杀是现在互联网系统中常见的营销模式,其中的技术难度,导致在资源协调上总是有些偏差。秒杀其实经常会出现的问题包括:
1).并发太高导致程序阻塞。2).库存无法有效控制,出现超卖的情况。
其实解决这些问题基本就两个方案:
1).数据尽量缓存,阻断用户和数据库的直接交互。2).通过锁来控制避免超卖现象。
现在说明一下,如果现在做一个秒杀,那么,Redis应该如何结合进行使用?
1).提前预热数据,放入Redis 2).商品列表放入Redis List 3).商品的详情数据 Redis hash保存,设置过期时间 4).商品的库存数据Redis sorted set保存 5).用户的地址信息Redis set保存 6).订单产生扣库存通过Redis制造分布式锁,库存同步扣除
7).订单产生后发货的数据,产生Redis list,通过消息队列处理 8).秒杀结束后,再把Redis数据和数据库进行同步
以上是一个简略的秒杀系统和Redis结合的方案,当然实际可能还会引入http缓存,或者将消息对接用MQ代替等方案
3、排行榜
另一个很普遍的需求是各种数据库的数据并非存储在内存中,因此在按得分排序以及实时更新这些几乎每秒钟都需要更新的功能上数据库的性能不够理想。
典型的比如那些在线游戏的排行榜,比如一个Facebook的游戏,根据得分你通常想要:
- 列出前100名高分选手
- 列出某用户当前的全球排名
4、显示最新的项目列表
下面这个语句常用来显示最新项目,随着数据多了,查询毫无疑问会越来越慢。
SELECT * FROM foo WHERE … ORDER BY time DESC LIMIT 10
在Web应用中,“列出最新的回复”之类的查询非常普遍,这通常会带来可扩展性问题。这令人沮丧,因为项目本来就是按这个顺序被创建的,但要输出这个顺序却不得不进行排序操作。
类似的问题就可以用Redis来解决。比如说,我们的一个Web应用想要列出用户贴出的最新20条评论。在最新的评论边上我们有一个“显示全部”的链接,点击后就可以获得更多的评论。
我们假设数据库中的每条评论都有一个唯一的递增的ID字段。
我们可以使用分页来制作主页和评论页,使用Redis的模板,每次新评论发表时,我们会将它的ID添加到一个Redis列表:
我们将列表裁剪为指定长度,因此Redis只需要保存最新的5000条评论:
这里我们做的很简单。在Redis中我们的最新ID使用了常驻缓存,这是一直更新的。但是我们做了限制不能超过5000个ID,因此我们的获取ID函数会一直询问Redis。只有在start/count参数超出了这个范围的时候,才需要去访问数据库。
我们的系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。
5:计数器
诸如统计点击数等应用。由于单线程,可以避免并发问题,保证不会出错,而且100%毫秒级性能!
6:队列
相当于消息系统,ActiveMQ,RocketMQ等工具类似,但是个人觉得简单用一下还行,如果对于数据一致性要求高的话还是用RocketMQ等专业系统。
由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以做判断用户是第几个访问这种业务
队列不仅可以把并发请求变成串行,并且还可以做队列或者栈使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值