Redis的使用

Posted 小橙子的快乐wu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的使用相关的知识,希望对你有一定的参考价值。

全面掌握Redis,看这篇文章就够了!

前面几遍文章,分布讲述了JS,Docker,nginx,但写的文章都相当于流水账似的,只是记录了这类语言的语法以及知识点,看似详细,内容很多,实际上并没有什么重点总结,只能作为了解来查漏补缺,不适合深入学习。
所以,接下来的文章,我会按照自己的思路来总结Redis的知识点!

一、Redis是什么?Redis有什么应用场景?

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value内存数据库,并提供多种语言的API。

Redis在Java Web中主要有两个应用场景:

存储热点数据,作为缓存存于内存中
实现高速读/写

二、Redis的特点

  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供string,list,set,zset,hash等数据结构的存储。
  3. Redis支持数据的备份,即master-slave模式的数据备份。

    三、Redis支持的数据结构

  4. String字符串:用来缓存一些静态文件,如图片、视频、css文件等。支持incr操作,可以用作计数器,比如统计网站访问次数等。
  5. List列表:微博中“关注、粉丝”、论坛中所有回帖的ID用的就是list列表,还有消息队列,也是列表。
  6. Set集合:可以快速查找元素是否存在,用于记录一些不能重复的数据。
  7. Zset有序集合:使用Sorted Set构建一个具有优先级的队列。
  8. Hash:适用于存储对象,比如把用户的信息存到hash里,以用户id为key,用户的详细信息为value。

    四、redis单线程执行却快的原因?

  9. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。
  10. 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
  11. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  12. 使用多路I/O复用模型,非阻塞IO(NIO);

    多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程,采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量

五、Redis事务

相关命令:

watch/unwatch:给Keys标记添加/清除为监测态
Multi:显示的开启事务,后续commands将排队
Exec:执行事务中的commands队列
Discard:清除事务中的commands队列

事务中的两种错误:

  1. 在调用exec命令之前的语法错误,Redis2.6.5之后所有命令不执行
  2. 在调用exec命令之后的错误(误操作),其他命令照样执行并返回结果

Redis事务中不支持回滚Rollback

Redis命令发生错误,其他命令照样执行,而不会回滚,这些错误都是开发中能够被检测出来的,在实际中不应该出现的错误,所以不必支持回滚,使Redis内部简洁并且更加高效。

六、Redis两种持久化方式

快照持久化:

Redis可以通过创建快照来获得存储在内存里面的数据在某个时间节点上的副本。在创建快照之后,用户可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本,还可以将快照留在原地以便重启服务器时使用。
创建快照:
1)客户端BGSAVE命令
2)SAVE指令,不常用,当内存不足以执行BGSAVE时使用
3)save配置选项,比如save 60 10000 60秒内有10000次写入触发BGSAVE
4)客户端shutdown时,执行SAVE
5)连接从服务器时,主服务器会执行BGSAVE创建快照
问题:如果系统发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。

AOF持久化

简单来说,AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化。因此,Redis只要从头到尾重新执行一次AOF文件包含的所有写命令,就可以恢复AOF文件所记录的数据集。
同步策略:
1)always:每个写命令都要同步写入磁盘,严重降低Redis速度
2)everysec:每秒执行一次同步
3)no:让操作系统来决定何时进行同步
问题:1.丢失少量数据,根据不同同步策略。2.AOF文件会越来越大(AOF文件重写)

七、Redis主从复制

一主二从时,客户端每次向主服务器写入数据时,通过复制主服务器的数据副本,从服务器实时更新数据。这样主服务器负责写数据,从服务器负责读数据,实现读写分离。

八、Redis集群

以上是关于Redis的使用的主要内容,如果未能解决你的问题,请参考以下文章

Redis数据库的日常使用

Redis使用总结 (序列三)

如何使用 Nodejs + Redis 获取给定 redis 键的 redis 值

使用 StackExchange.Redis 的 Redis 键空间通知

redis-- 缓存(redis作为缓存使用)

谁有好用的Java使用redis的封装的示例