redis的二三事

目录

 

1.redis的概念

2.redis的数据类型

3.redis的配置文件

4.redis的数据持久化

5.redis的事务

6.redis常见的应用场景

7.redis的内存管理与数据淘汰机制


 

1.redis的概念

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,它通常被称为数据结构服务器,是一个非关系型数据库。

2.redis的数据类型

redis主要包括string(字符串)、hash(哈希)、list(列表)、set(集合)和zset(sorted set 有序集合)五种常见的数据类型。

(1)字符串(string)

字符串是redis最基本的数据类型,一个 key 对应一个 value,redis的string可以包含多种数据,比如jpg图片或者序列化的对象,string 类型的值最大能存储 512MB。 

redis的key名设计原则:

    1.可读性和可管理性,可以防止键名冲突,如数据库名:表名:id

    2.简洁性,在保证语义的情况下,严格控制key的长度,key过长时会占用过多内存。

(2)哈希(hash)

redis 的哈希类型是每一个 key 都对应一个 HashTable,比较适合存储对象或者数组。

(3)列表(list)

redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

(4)集合(set)

redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

(5)有序集合(sorted set)

redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

3.redis的配置文件

            redis配置文件的目录:/usr/local/etc/redis.conf,可以通过命令config get *迅速获取配置信息。

dump.rdb表示redis的持久化文件requirepass表示redis的连接密码。

port表示redis的默认端口,maxclients表示最大连接数。

save表示redis的保存写入机制,save 300 10 表示每300秒有10次更改,就把内存中的数据同步到硬盘。

4.redis的数据持久化

         (1)什么是数据持久化

          数据持久化就是当设备断电时数据不会丢失,就是我们所说的将数据存储在硬盘上。redis提供了RDB持久化和AOF持久化两种方式。

         (2)RDB持久化

        RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置。

   save 900 1     #900秒内如果超过1个key被修改,则发起快照保存
   save 300 10    #300秒内容如超过10个key被修改,则发起快照保存
   save 60 10000
  • RDB保存文件过程:redis在主进程运行的同时,会fork一个子进程,父进程负责处理客户端请求,子进程负责负责把数据写入临时文件,写入完毕后用临时文件替换原来的快照文件,然后子进程退出。
  • 优势:1.方便快速的备份,整个redis数据库只有一个dump.rdb文件。2.RDB 可以最大化 redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作,节省了内存空间。
  • 劣势:1.数据丢失的风险,因为RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。 因此你可能会至少 几分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。2.每次保存RDB的时候,redis都会fork出一个子进程,当要处理的数据集较大时,容易消耗内容,造成一定程度上的延时,带来部分数据丢失。

         (3)AOF持久化                

  • AOF保存文件过程:redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。

appendonly yes              //启用aof持久化方式
  • 优势:1.使用AOF持久化可以使redis数据更持久,AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据。2.AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存,因此 AOF 文件的内容非常容易被人读懂,对文件进行分析(parse)也很轻松。
  • 劣势:1.对于相同类型的数据集,AOF的体积要大于RDB的体积。2.根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 

        (4)比较

        比较两中持久化方式的优劣,可以考虑两种方式一起使用。

5.redis的事务

  1. redis的事务和mysql事务的比较:mysql作为一种关系型数据库,具有原子性,一致性,持久性,隔离性的特性。单个 Redis 命令的执行是原子性的,但 redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
  2. redis事物的执行流程:
  • 开始事务。
  • 命令入队。
  • 执行事务。

      3. 实例:

      可以看出即使有一个命令执行失败,其他的命令还是可以正常执行的。

6.redis常见的应用场景

1、缓存

合理的利用缓存不仅可以提高网站的访问速度,而且可以减少数据库的读取操作,redis提供了key值过期功能,而且提供了灵活的键值淘汰策略。

2、排行榜

排行榜在各类网站中应用很普标,如微博热文榜,购物商城的商品销量排行榜,redis的有序集合可以很好地利用队列的特性实现排行榜应用。

3、计数器

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

4、redis跨域共享session

相对于session的跨域共享,把session存在redis里,并且搭建redis主从服务器,可以实现session的跨域共享。

5、社交网络

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

7.redis的内存管理与数据淘汰机制

在使用Redis时,应该对数据占用的最大空间有一个基本准确的预估,并为Redis设定最大使用的内存。否则Redis会无限制地占用内存(当物理内存被占满后会使用swap空间),容易引发各种各样的问题。

通过如下配置控制Redis使用的最大内存:

maxmemory 100mb

 

在内存占用达到了maxmemory后,再向Redis写入数据时,Redis会:

  • 根据配置的数据淘汰策略尝试淘汰数据,释放空间
  • 如果没有数据可以淘汰,或者没有配置数据淘汰策略,那么Redis会对所有写请求返回错误,但读请求仍然可以正常执行

Redis提供了5种数据淘汰策略:

  • volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key
  • allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰
  • volatile-random:随机淘汰数据,只淘汰设定了有效期的key
  • allkeys-random:随机淘汰数据,所有的key都可以被淘汰
  • volatile-ttl:淘汰剩余有效期最短的key

最好为Redis指定一种有效的数据淘汰策略以配合maxmemory设置,避免在内存使用满后发生写入失败的情况。

一般来说,推荐使用的策略是volatile-lru,并辨识Redis中保存的数据的重要性。对于那些重要的,绝对不能丢弃的数据(如配置类数据等),应不设置有效期,这样Redis就永远不会淘汰这些数据。对于那些相对不是那么重要的,并且能够热加载的数据(比如缓存最近登录的用户信息,当在Redis中找不到时,程序会去DB中读取),可以设置上有效期,这样在内存不够时Redis就会淘汰这部分数据。

配置方法:

maxmemory-policy volatile-lru   #默认是noeviction,即不进行数据淘汰

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值