文章目录

  • redis是什么
    • 优点:
    • 缺点:
  • redis 为什么这么快
  • 为什么要用redis 做缓存
  • Redis 常见数据结构
    • string
    • list
    • hash
    • set
    • sorted set
  • redis 常用场景
  • redis 如何做内存优化

————————————————————————————————

redis是什么

Redis本质上是一个Key-Value类型的内存数据库,很像Memcached,整个数据库加载在内存当中操作,定期通过异步操作把数据库中的数据flush到硬盘上进行保存。

因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value数据库。

优点:

  • 读写性能极高,Redis能读的速度是110000次ls,写的速度是81000次ls。
  • 支持数据持久化,支持AOF和RDB两种持久化方式。
  • 支持事务,Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 数据结构丰富,除了支持string类型的value外,还支持hash、set、zset、list等数据结构。
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
  • 丰富的特性– Redis还支持publish/subscribe,通知,key过期等特性。

缺点:

  • 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

redis 为什么这么快

  • 内存存储:Redis是使用内存(in-memeroy)存储,没有磁盘IO上的开销。数据存在内存中,类似于HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1)。
  • 单线程实现(Redis 6.0以前): Redis使用单个线程处理请求,避免了多个线程之间线程切换和锁资源争用的开销。注意:单线程是指的是在核心网络模型中,网络请求模块使用一个线程来处理,即一个线程处理所有网络请求。
  • 非阻塞IO:Redis使用多路复用IO技术,将epoll作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。
  • 优化的数据结构:Redis有诸多可以直接应用的优化数据结构的实现,应用层可以直接使用原生的数据结构提升性能。
  • 使用底层模型不同:Redis直接自己构建了VM(虚拟内存)机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

为什么要用redis 做缓存

从高并发上来说:

  • 直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

从高性能上来说:

  • 用户第一次访问数据库中的某些数据。因为是从硬盘上读取的所以这个过程会比较慢。将该用户访问的数据存在缓存中,下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据。

Redis 常见数据结构

string

string 数据结构是简单的 key-value 类型。

应用场景 :一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。

127.0.0.1:6379> set key value #设置 key-value 类型的值
OK
127.0.0.1:6379> get key # 根据 key 获得对应的 value
"value"
127.0.0.1:6379> exists key  # 判断某个 key 是否存在
(integer) 1
127.0.0.1:6379> strlen key # 返回 key 所储存的字符串值的长度。
(integer) 5
127.0.0.1:6379> del key # 删除某个 key 对应的值
(integer) 1
127.0.0.1:6379> get key
(nil)

list

Redis 的 list 的实现为一个 双向链表,即可以支持反向查找和遍历。

应用场景: 发布与订阅或者说消息队列、慢查询。

127.0.0.1:6379> rpush myList value1 # 向 list 的头部(右边)添加元素
(integer) 1
127.0.0.1:6379> rpush myList value2 value3 # 向list的头部(最右边)添加多个元素
(integer) 3
127.0.0.1:6379> lpop myList # 将 list的尾部(最左边)元素取出
"value1"
127.0.0.1:6379> lrange myList 0 1 # 查看对应下标的list列表, 0 为 start,1为 end
1) "value2"
2) "value3"
127.0.0.1:6379> lrange myList 0 -1 # 查看列表中的所有元素,-1表示倒数第一
1) "value2"
2) "value3"

hash

​ hash 是一个 string 类型的 field 和 value 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对

象中的某个字段的值。

​ 比如我们可以 hash 数据结构来存储用户信息,商品信息等等。

set

Redis 中的 set 类型是一种无序集合,集合中的元素没有先后顺序。

应用场景: 需要存放的数据不能重复以及需要获取多个数据源交集和并集等场景。

比如:你可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis 可以非常方便的实现如共同关注、

共同粉丝、共同喜好等功能。

sorted set

​ 和 set 相比,sorted set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的

范围来获取元素的列表。

应用场景: 需要对数据根据某个权重进行排序的场景。比如在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排

行榜,弹幕消息(可以理解为按消息维度的消息排行榜)等信息。

redis 常用场景

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

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

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

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

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

6、社交网络
点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。如在微博中的共同好友,通过Redis的set能够很方便得出。

7、最新列表
Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。

8、消息系统
消息队列是大型网站必用中间件,如ActiveMQ、RabbitMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务。Redis提供了发布/订阅及阻塞队列功能,能实现一个简单的消息队列系统。另外,这个不能和专业的消息中间件相比。

redis 如何做内存优化

  • 控制key的数量。当使用Redis存储大量数据时,通常会存在大量键,过多的键同样会消耗大量内存。Redis本质是一个数据结构服务器,它为我们提供多种数据结构,如hash,list,set,zset等结构。使用Redis时不要进入一个误区,大量使用get/set这样的API,把Redis当成Memcached使用。对于存储相同的数据内容利用Redis的数据结构降低外层键的数量,也可以节省大量内存。

  • 缩减键值对象,降低Redis内存使用最直接的方式就是缩减键(key)和值(value)的长度。

    • key长度:如在设计键时,在完整描述业务情况下,键值越短越好。
    • value长度:值对象缩减比较复杂,常见需求是把业务对象序列化成二进制数组放入Redis。
      首先应该在业务上精简业务对象,去掉不必要的属性避免存储无效数据。其次在序列化工具选择上,应该选择更高效的序列化工具来降低字节数组大小。
  • 编码优化。Redis对外提供了string,list,hash,set,zet等类型,但是Redis内部针对不同类型存在编码的概念,所谓编码就是具体使用哪种底层数据结构来实现。编码不同将直接影响数据的内存占用和读写效率。

redis—redis概述相关推荐

  1. linux测试模块redis,redis 入门(一)——Linux环境安装测试以及基本命令演示

    redis概述 redis是一个开源的,先进的 key-value 存储可用于构建高性能的存储解决方案.它支持数据结构有字符串,哈希,列表,集合,带有范围查询的排序集,位图,超文本和具有半径查询的地理 ...

  2. 查看linux上面是否有安装redis,redis启动

    1.检测是否有安装redis-cli和redis-server; [root@localhost bin]# whereis redis-cli redis-cli: /usr/bin/redis-c ...

  3. ServiceStack.Redis——Redis于.net向上client解

    ServiceStack.Redis--Redis于.net向上client解 源代码和使用: https://github.com/ServiceStack/ServiceStack.Redis 样 ...

  4. php 不识别redis,redis,_redis卡死无法读取数据如何解决?,redis - phpStudy

    redis卡死无法读取数据如何解决? 之前是redis dump.rdb 的时候会卡死,然后我关掉了save功能,但是过了一段时间之后又卡死了,这次不知道什么原因,怎样解决了. 以下是info的信息: ...

  5. Redis - Redis command timed out nested exception is io.lettuce.core.RedisCommandTimeoutException

    Redis - Redis command timed out nested exception is io.lettuce.core.RedisCommandTimeoutException 这个问 ...

  6. [redis] Redis 配置文件置参数详解

    ################################ 基础配置 ################################# #daemonize no 默认情况下, redis 不 ...

  7. Redis Redis Sentinel 基本使用

    Redis & Redis-sentinel 基本使用 本文主要介绍如下几点内容: Redis基本配置 Redis Sentinel基本配置 Redis Client客户端基本内容 Redis ...

  8. 跟我学Redis——Redis安装

    Redis介绍 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), ...

  9. [喵咪Redis]Redis安装与介绍

    [喵咪Redis]Redis安装与介绍 前言 哈喽大家好啊,这次要来和大家一起来了解学习Redis的一系列技术,最终目的是搭建一个高可用redis集群自动负载灾备,那我们先从最基础的Redis的一些基 ...

  10. linux判断redis是否启动成功_查看linux上面是否有安装redis,redis启动

    1.检测是否有安装redis-cli和redis-server; [root@localhost bin]# whereis redis-cli redis-cli: /usr/bin/redis-c ...

最新文章

  1. go的打包依赖构建工具-dep
  2. SAP QM QP02 没有ECO试图直接修改检验计划主数据?
  3. 基于Springboot实现共享自习室管理系统
  4. cs6 数据库mysql_能mysql内容
  5. 【编译原理】关于LL(1)文法的探索
  6. java小程序扑克牌_用Java来写一个模拟斗地主发牌的小程序
  7. JavaScript splice() 方法使用
  8. 每个人都知道MVC…
  9. Flink中的容错机制
  10. 分享一个自己做的简易敏捷开发管理工具——AgileLite
  11. 14款CSS3图片层叠切换动画
  12. word中如何替换一些特殊符号
  13. Python编程基础 第五章 编程练习 编写程序实现以下功能:根据指定值从一个列表中查找所有匹配元素的位置,要求使用列表中的index方法进行查找。
  14. 保镖机器人作文_保镖小学生作文
  15. html5制作电子日历,基于HTML5的日历制作软件
  16. Apollo - 阿波罗配置中心使用,一文搞定!
  17. 你们公司有职业通路图吗
  18. 使用 youtube api封装播放器的坑
  19. 2022中国开发者影响力盛典暨CSDN企业生态汇在京举行
  20. Qt相关资源下载百度云地址 永久有效

热门文章

  1. Application Loader上传app,一直卡在“正在通过 App Store 进行鉴定”
  2. 用c语言做个报数游戏和验证码系统
  3. mysql数据库 auto_increment_mysql学习笔记(二:中的auto_increment 理解
  4. 电子货架标签----拣货系统
  5. Deepin 20社区版设置双屏显示
  6. 2022最新影视小程序源码支持josn官解 卡密系统
  7. mobi格式文件解压实践
  8. Linux中的su 和su -
  9. vsftp 多用户不同访问权限配置
  10. 姓名转拼音的几种格式