目录
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的事务
- redis的事务和mysql事务的比较:mysql作为一种关系型数据库,具有原子性,一致性,持久性,隔离性的特性。单个 Redis 命令的执行是原子性的,但 redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
- 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,即不进行数据淘汰