redis的使用(redis的使用场景)

本篇文章给大家谈谈redis的使用,以及redis的使用场景对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Redis数据库适合使用于哪些应用场景

redis开创了一种新的数据存储思路,使用redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。

redis常用数据类型

redis最为常用的数据类型主要有以下五种:

string

hash

list

set

sorted set

在具体描述这几种数据类型之前,我们先通过一张图了解下redis内部内存管理中是如何描述这些不同数据类型的:

首先redis内部使用一个redisobject对象来表示所有的key和value,redisobject最主要的信息如上图所示:type代表一

个value对象具体是何种数据类型,encoding是不同数陪配蠢据类型在redis内部的存储方式,比如:type=string代表value存储的是

一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然

前提是这个字符串本身可以用数值表示,比如:"123"

"456"这样的字符串。

这里需要特殊说明一下vm字段,只有打开了redis的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的,该功能会在后面具体描述。通过

上图我们可以发现redis使用redisobject来表示所有的key/value数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了给

redis不同数据类型提供一个统一的管理接口,实际作者也提供了多种方法帮助我们尽量节省内存使用,我们随后会具体讨论。

下面我们先来逐一的分析下这五种数据类型的使用和内部实现方式:

string

常用命令:

set,get,decr,incr,mget 等。

应用场景:

string是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。

实现方式:

string在redis内部存储默认就是一个字符串,被redisobject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisobject的encoding字段为int。

hash

常用命令:

hget,hset,hgetall 等。

应用场景:

我们简单举个实例来描述下hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:

用户id为查找的key,存储的value用户对象包含姓名,卖悔年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:

第一种方式将用户id作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入cas等复杂问题。

第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户id+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户id为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

那么redis提供的hash很好的解决了这个问题,redis的hash实际是内部存储的value为一个hashmap,并提供了直接存取这个map成员的接口,如下图:

也就是说,key仍然是用户id,

value是一个map,这个map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部map的key(redis里称内部map的key为field),

也就是通过 key(用户id) + field(属性标签)

就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。很好的解决了问题。

这里同时需要注意,redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部map的成员很多,那么涉及到遍历整个内部map的

操作,由于redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。

实现方式:

上面已经说到redis

hash对应value内部实际就是一个hashmap,实际这里会有2种不同实现,这个hash的成员比较少时redis为了节省内存会采用类似一维数组的方式来紧凑芦陪存储,而不会采用真正的hashmap结构,对应的value

redisobject的encoding为zipmap,当成员数量增大时会自动转成真正的hashmap,此时encoding为ht。

list

常用命令:

lpush,rpush,lpop,rpop,lrange等。

应用场景:

redis

list的应用场景非常多,也是redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用redis的list结构来实现,比较好理解,这里不再重复。

实现方式:

redis

list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

set

常用命令:

sadd,spop,smembers,sunion 等。

应用场景:

redis

set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

实现方式:

set 的内部实现是一个

value永远为null的hashmap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

sorted set

常用命令:

zadd,zrange,zrem,zcard等

使用场景:

redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted

set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted

set数据结构,比如twitter 的public

如何使用Redis 做队列操作

redis设计用来做缓存的,但是由于它自身的某种特性改胡使得它可以用来做消息队列,它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列;

另外,做消息队列的其他特性例如FIFO(先入先出)也很容易实渣歼巧现,只需要一个list对象从头取数据,从尾部塞数据即可;

redis能做消息队列还得益于其list对象blpop brpop接口以及Pub/Sub(发布/订阅)的某些接口,它们都是阻塞版的,所以可如键以用来做消息队列。

[img]

redis在什么情况下使用

常见的说法是,有N多热点数据,又是临时用一下,又想提高并发速度,吞吐量,那就可以考虑,如淘宝的节假日的销售活动。提前把数据准备好,活动完后失效。

我的禅纤看法,有足够多的内存,我又想让系统极快。就可以把redis当数据库用,redis可以永久缓存数据,但是这些数据要小于能使用的内存量。小点的项目比较适合,我干过这事。

接口级别缓存一定量网络请求数据,省去自己设计的缓存不安全,不完善的麻烦。比如开发微网站:要缓存的微信的认证串,用户认证数据。cookie,session等。我同样干过这事,跟第二段一起做腊棚的。前提是数据量适中,现有机器配置,可以5年以上不出问题。

还有人会结合mysql或oracle使用,缓存用户查询的数据。对小项目我个人以为没必要的。大项目功能如第一点。在小项目中,mysql或oracle自己就可以把所有的表、数据等直接加载到内存中。数据预热后,访问效率一点不差。秒以内可以从2000W以上的数据中找出REGEXP写的查询。我同样也干过这事。多线程+mysql全部加载到内存+查询结果合并不会超过1秒。2秒以内把查询结果展现出来。

总之redis不是大轮袭则项目的专利,看你能想到什么地方,就能用到什么地方。使用redis的根本出发点是快+高并发。

Redis的基本使用(二) 消息队列

使用消息中间件的时候,并非每次都需要非常专业的消息中间件,假如只有一个消息队列,只有一个消费者,那就没有必要去使用专业的消息中间件,这种情况可以直接使用 Redis 来做消息大敬则队列。

Redis 的消息队列不是特别专业,他没有很多高级特性,适用简单的场景,如果对稿扰于消息可靠性有着极高的追求,那么不适合使用 Redis 做消息队列。

Redis 做消息队列,使用它里边的 List 数据结构就可以实现,使用 lpush/rpush 操作来实现入队,然后使用 lpop/rpop 来实现出队。

在客户端(例如 Java 端),我们会维护一个死循环来不停的从队列中读取消息,并处理,如果队列中有消息,则直

接获取到,如果没有消息,就会陷入死循环,直到下一次有消息进入,这种死循环会造成大量的资源浪费,这个滚棚时候,

可以使用之前讲的 blpop/brpop 。

blpop 阻塞式的弹出,相当于 lpop 的阻塞版。

延迟队列可以通过 zset 来实现,因为 zset 中有一个 score,我们可以把时间作为 score,将 value 存到redis 中,然后通过轮询的方式,去不断的读取消息出来。

首先,如果消息是一个字符串,直接发送即可,如果是一个对象,则需要对对象进行序列化,这里我们

使用 JSON 来实现序列化和反序列化。

首先在项目中,添加 JSON 依赖:

接下来,构造一个消息对象:

接下来封装一个消息队列:

测试:

redis适合什么场景?

1、缓存。 缓存现在几乎是所有中大型网站都在用的必杀技,合缓顷理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。(推荐:《 Redis视频教程 》)

2、排行榜。 很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。

3、计数器。 什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

4、分布式会话。 集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

5、分布式锁。 在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不雀做大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考扰岁陆虑的细节要更多。

如何连接redis

本人也是刚开始使用redis,目前接触到的根据业务的不同连接redis的情况有两种:

一:

1、先进到redis安装目录的bin目录下,本人的机器安装在这里,即/data/redis/bin

2、在/data/redis/bin目录下可以发现有一个redis-cli文件,执行该文件后即可进入命令为:./redis-cli,由于有密码,要输入密码,命令为:auth 密码,出现ok的时候即已经进入了redis

1、一般测试在使用redis的时候,使用的命令改告也较少,在此列岩备举常用的几个:

查看所有的key:keys *

查看key的value:get 某核枣明个key

删除某个key: del 某个key

关于redis的使用和redis的使用场景的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表