Deprecated - Redis基础

New Link :https://blog.csdn.net/BigBug_500/article/details/100082393

与memcached的区别

  • Redis拥有更多的数据结构和操作
  • Redis本身就支持集群
  • Redis可以将内存中的数据持久化到磁盘,重启Redis后,又可以将磁盘中的数据读取到内存中
  • Redis在对100k下的数据存储效率更高
  • Redis是单线程的多路IO复用模型

为什么使用单进程单线程

Redis is single threaded. How can I exploit multiple CPU / cores?
It's not very frequent that CPU becomes your bottleneck with Redis, as usually Redis is either memory or network bound. For instance, using pipelining Redis running on an average Linux system can deliver even 1 million requests per second, so if your application mainly uses O(N) or O(log(N)) commands, it is hardly going to use too much CPU.

However, to maximize CPU usage you can start multiple instances of Redis in the same box and treat them as different servers. At some point a single box may not be enough anyway, so if you want to use multiple CPUs you can start thinking of some way to shard earlier.

You can find more information about using multiple Redis instances in the Partitioning page.

However with Redis 4.0 we started to make Redis more threaded. For now this is limited to deleting objects in the background, and to blocking commands implemented via Redis modules. For the next releases, the plan is to make Redis more and more threaded.

官方文档解释:因为cpu并不是Redis的瓶颈,在单线程模式的情况下已经很快了,就没有必要再使用多线程了

为什么数据读取快

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2、采用单线程,避免了多线程的上下文切换和竞争条件

3、使用了 I/O 多路复用模型(也叫事件驱动模型);

多路I/O复用模型是利用 select、poll、epoll 同时监察多个 IO 流的 FD 是否就绪,把多个 IO 的阻塞复用到同一个 select 的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。由于 select 函数是顺序扫描 FD 是否就绪,效率比较低,Linux 提供了另外一个 epoll系统调用,基于事件驱动方式 代替 顺序扫描,因此性能更高,是 Redis 中使用到的。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用 I/O 多路复用 技术可以让单个线程高效的处理多个连接请求(减少了等待网络 IO 数据的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。

关于 Linux 中的5中网络 I/O 模型参考:BIO、NIO、AIO与Linnux下的IO模型 概览_BigBug_500的博客-CSDN博客

Redis 常用 数据类型:

字符串:String(SET key value)

最基础的数据存储类型;

按二进制存储,也就是可以接受任何类型格式的数据;

规定了一个字符串 value 最大可为 512M

应用场景:

1. 存储热点的单个字符串或者 JSON 串

2. 由于是二进制安全的,可以存储图片文件到 value 中

3. 线程安全的计数器(如使用 INCR key 来完成点赞或文章阅读数的修改)

4. 用作分布式锁(SET...NX 或 SETNX ...)

可重复列表:List (LSET key index value):

简单的字符串列表,按照插入顺序排序(可用该特性完成需要的数据结构),允许重复元素;

可以 添加 / 删除 一个元素在列表的头部(LPUSH key value [value …] 、 LPOP key)或者列表的尾部(RPUSH key value [value …] 、 RPOP key),也可以删除列表中的值(LREM key count value)

应用场景:

1. 使用 BLPOP key timeout 在timeout时间内等待弹出队首元素,来实现一个任务队列、消息队列。

2. 在分布式机器中,将日志记录到 Redis 中的 List 中,然后按顺序记录到一个日志文件中。

哈希表:Hashs(HSET key field value):

可以看成具有键值对的map容器

应用场景:

1. 用来存储对象的键值对。如果使用字符串类型来存储 JSON 字符串对象,JSON 的序列化/反序列化会带来性能上的消耗,且在修改 JSON 字符串对象时,需考虑线程安全问题。如果使用哈希表来存储对象中的键值对,不会有序列化和线程安全问题,且占用内存小。

不重复集合:Set(SADD key member [member ...]):

没有排序的字符集合,集合中不允许出现重复的元素

应用场景:

1. 使用 SRANDMEMBER key [count] 从集合中随机取出 count 个元素,可用作热点数据分类的随机推送

2. 使用 SINTER / SUNION / SDIFF 求两个集合的交、并、差,来实现对应的数据要求。

有序不重复集合:SortedSet(ZADD key score member [score] [member]):

带有分数的set集合,并按升序排列;

其中的元素是唯一的, 但分数(score)是可以重复的;

score使用64位存储,整数范围为 正负9*10^18,双精度 double 需要注意精度的丢失

应用场景:

1. 对数据进行一个排序,并可以在列表中拿到最大,最小的多少个元素等操作。

2. 实现定时的消息发送,使用 score 存储需要发送消息的时间戳,服务端轮询 SortedSet 中的数据判断是否要发送通知。

位图:SETBIT key offset value

将数据的 id 信息映射到位图二进制中的某一位上,然后用 0和1表示一个状态,可用于大量的统计计算。

应用场景:

1. 对所有电影在全年内没有播放的统计。将每一条电影数据映射到位图中,在播放某一部电影时,将对应的位图中位修改为1,然后对大量的每天产生的一个 BitMaps 进行或运算(BITOP or storeKey key1 key2...),得到的 storeKey 中 位为0的就是没播放的电影。

HyperLogLog

HyperLogLog是用作基数(集合中,不重复元素的个数)统计的,内部使用了loglog算法。该种数据结构的操作只有添加元素、获取基数个数、合并多个HyperLogLog。

注意点:

1. HyperLogLog中,并不会存储添加的具体数据,只是记录集合的基数

2. 基数是算法估算的结果,会有0.81%的误差,但是该数据结构一般用在数据量非常大的场景,故该误差对系统影响可忽略

3. HyperLogLog占用的空间一定不会超过12KB,占用空间少

地理位置:GEOADD key longitude latitude member [longitude ...]

上述 api 中,key表示地图集、longitude表示经度、latitude表示纬度、member表示当前坐标点名称。

应用场景:

1. 使用 GEORADIUSBYMEMBER key member radius m|km|ft|mi 求得已存在点 member 附近 radius 内所有的点,可用于查找附近的人。同样也可以使用 GEORADIUS 命令实现。

Redis API 文档参看:Redis 命令参考 — Redis 命令参考

5种数据类型对应的底层结构参考:面试:原来Redis常用的五种数据类型底层结构是这样的 - 架构师之路 - SegmentFault 思否

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值