zoukankan      html  css  js  c++  java
  • Redis数据库介绍

    1 Redis简介

    Redis,全称远程字典服务(REmote DIctionary Server),是一个开源、基于内存、高性能、可数据持久化的key-value存储系统,遵守BSD协议,可用作数据库、缓存和消息中间件。
    在Redis中文官网上是这么描述的:

    redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串strings,散列hashes,列表lists,集合sets,有序集合sorted sets的范围查询,bitmaps,hyperloglogs 和地理空间geospatial索引半径查询。Redis内置了复制replication,LUA脚本Lua scripting,LRU驱动事件LRU eviction,事务transactions和不同级别的磁盘持久化persistence,并通过 Redis哨兵Sentinel和自动分区Cluster提供高可用性high availability。

    在日常应用中,Redis主要适用于以下几个场景:
    (1)缓存
    (2)排行榜
    (3)计数器
    (4)分布式会话
    (5)分布式锁
    (6)社交网络
    (7)最新列表
    (8)消息系统

    2 Redis的基本特性

    Redis具有许多优秀特性,包括:支持多种数据类型、支持数据的持久化机制、支持事务控制、支持主从复制功能等。

    2.1 数据类型

    Redis的数据存储是通过Key映射Value的方式,建立字典以保存数据。Redis共支持五种数据类型。
    (1)String(字符串)
    Redis最基本的类型,一个key对应一个value。
    (2)Hash(哈希表)
    键值对集合,是一个string类型的数据域field和值value的映射表。
    (3)List(列表)
    字符串列表,按照插入顺序排序。支持在列表的头部或者尾部添加数据元素。
    (4)Set(集合)
    字符串类型的无序集合,支持添加、删除、查找,Redis还能对set进行交集、并集、差集等集合操作。
    (5)Zset(有序集合)
    字符串类型的有序集合,集合中的每个元素都会关联一个double类型的分数。Redis通过这个分数为集合进行排序。

    2.2 数据的持久化机制

    Redis支持持久化,在运行情况下,Redis以数据结构的形式将数据维持在内存中,通过将内存中的数据保持到磁盘,让这些数据在Redis重启之后可用来持久化。Redis分别提供了两种持久化模方式。
    (1)RDB方式
    即Snapshotting(快照)方式,是Redis默认的持久化方式。在Redis运行时,每隔几分钟或者几次操作后,RDB程序将内存中的数据以快照的方式保存到磁盘二进制文件dump.rdb中。在Redis重启时,RDB程序通过载入RDB文件的方式做快照持久化。RDB的配置信息保存在reedis.conf文件中。
    RDB快照实现的数据持久化方式,存在的问题是:当在RDB程序保存数据的指定间隔之间,Redis断开连接,那么在上一次保存到此刻的数据就无法被保存。因此,为了解决这个问题,Redis还提供了AOF的持久化。
    下面是RDB的默认配置(redis.conf)

    save 900 1		# 900秒内如果超过1个key被修改,进行快照
    save 300 10	
    save 60 10000
    

    (2)AOF方式
    AOF以协议文本的方式,在使用AOF持久化时,Redis会将所有对数据库进行的命令(及其参数)写入到AOF日志文件appendonly.aof中,以此达到记录数据库状态的目的,当Redis重启时,就会通过执行AOF日志记录的命令进行数据的快速恢复。
    Redis还设计了AOF重写机制:扫描数据库数据,转化为Redis命令存入临时AOF文件中,在扫描完成后用临时文件代替AOF文件。这使得AOF文件中记录的命令是最简洁的,在一定程度上避免了AOF随着时间的增长,占据磁盘的过多空间。
    下面是默认的aof配置(redis.conf)

    appendonly no			# 是否启动aof持久化方式
    appendfilename "appendonly.aof"	#aof 文件名称
    # appendfsync always	# 每收到命令就写一次
    appendfsync everysec	# 每秒钟写一次
    # appendfsync no		# 完全依赖os
    

    2.3 事务控制

    Redis事务的本质是一组命令的集合。在事务执行过程,队列中的命令会按照顺序串行化执行,此时,其他命令请求都不会插入到事务执行序列中。Redis可以通过MULTI/EXEC支持简单的事务控制:当客户端使用MULTI命令时,这个连接将会进入一个事务上下文,连接后续的命令都会放在事务队列中。当连接收到exec命令时,Redis将顺序地执行事务队列中的所有命令。

    2.4 主从复制

    主从复制就是使当前的服务器复制指定服务器的内容。被复制的服务器称为主服务器(master),对主服务器进行复制操作的服务器称为从服务器(slave)。
    Redis通过修改redis.conf文件来使用和配置主从复制,复制过程上大体分为建立连接、数据同步、命令传播三个阶段。Redis主从复制功能强大,一个master支持多个slave连接,slave支持其他slave的连接,主从复制时,不会阻塞master和slave。
    利用Redis主从复制的特效,可以实现以下功能:实现读写分离,比如用主服务器写数据,用从服务器读;支持备份数据分离,利用主从复制的方便,用slave服务器的一个或两个服务器来进行数据备份。
    下面是默认的Master-Slave replication配置(redis.conf)

    # slaveof <masterip> <masterport>	# 当前节点是slave时配置
    slave-serve-stale-data yes	# master失去联系时,slave是否会反馈客户端的请求
    slave-read-only yes			# salve实例是否接受写操作
    slave-priority 100		# slave的优先级
    

    3 Redis安装与使用

    3.1 安装Redis

    (1)从官网下载redis安装包

    (2)解压到文件
    (3)启动cmd,切换到redis目录,输入命令 redis-server redis.windows.conf
    输入之后,会显示如下界面:

    (4)另启一个 cmd 窗口,切换目录,输入命令 redis-cli.exe -h 127.0.0.1 -p 6379
    这里的-h表示redis的bind的ip地址,-p指端口,输入之后显示:

    (5)开始使用redis
    设置键值对 set akey am

    取出键值对 get akey

    3.2 在Spring中使用Redis

    工具:Redis Desktop Manager
    (1)导入redis依赖

    	<dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-redis</artifactId>
        	<version>2.2.1.RELEASE</version>
    	</dependency>
    

    (2)配置文件配置redis和连接池的信息

    	spring:
     	 redis:
        		host: localhost
        		port: 6379
        		# password: root # 根据需要
        		# 连接超时时间(毫秒)
        		timeout: 10000
        		# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
        		database: 0
        		lettuce:
         		pool:
            		# 连接池最大连接数(使用负值表示没有限制) 默认 8
           			max-active: 8
            		# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
           			max-wait: -1
            		# 连接池中的最大空闲连接 默认 8
            		max-idle: 8
            		# 连接池中的最小空闲连接 默认 0
            		min-idle: 0
    

    (3)RedisTemplate配置

    public class RedisCacheAutoConfiguration {
    
    	@Bean
    	public RedisTemplate<String, Serializable>
    		redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){
    		RedisTemplate<String, Serializable> template = new RedisTemplate<>();
    		//设置key序列化方式,StringRedisSerializer的序列化方式
    		template.setKeySerializer(new StringRedisSerializer());
    		//设置value序列化方式,序列化为json
    		template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    		//设置连接池
    		template.setConnectionFactory(redisConnectionFactory);
    		return template;
    	}
    }
    

    (4)使用Redis
    声明RedisTemplate

    	@Autowired
    	private RedisTemplate redisTemplate;
    

    Redis操作代码

    String akey = "akey";
    if(redisTemplate.hasKey(akey)){
        redisTemplate.delete(akey);
    }
    redisTemplate.opsForValue().set(key, "am");
    Object value = redisTemplate.opsForValue().get(akey);
    

    启动redis服务端,启动可视化工具并连接到redis

    3.3 Redis操作命令

    (1)对value操作的命令
    (2)对String操作的命令
    (3)对List操作的命令
    (4)对Set操作的命令
    (5)对Zset操作的命令
    (6)对Hash操作的命令
    (7)持久化操作命令
    (8)远程服务控制命令
    详见:Redis中文官网命令手册

    4 Redis与中间件

    Redis中文官网的首页这么写到
    —— Redis可以用作数据库、缓存和消息中间件。

    4.1 中间件

    百度百科是这么定义中间件的:

    中间件是介于应用系统和系统软件之间一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统各个部分或不同应用,达到资源、功能共享的目的。
    中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。

    使用中间件,我们能够达到的效果是:使用这项服务的人,不需要知道底层逻辑的具体实现,就可以直接拿着中间件的结果来用。
    显然,Redis属于中间件。

    4.2 Redis消息中间件

    消息中间件关注于数据的发送和接受,利用高效可靠的异步消息传递机制进行平台无关的数据交流,并基于数据通信集成分布式系统。
    Redis消息队列通常采用广播发布及订阅模式:基于Redis的Pub/Sub机制,此模式允许生产者只生产一次消息,由中间件负责将消息复制到多个消息队列,每个消息队列由对应的消费组消费。订阅者可以通过subscribe向redis server订阅自己感兴趣的消息类型。redis将信息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该消息类型的全部订阅者都会收到此消息。
    Redis的Pub/Sub实现:
    (1)启动Redis服务器

    (2)启动客户端,订阅am频道

    (3)启动另一客户端,向服务器推送am频道的信息

    此时,订阅了am频道的客户端接收到了信息

    5 参考

    [1] 马豫星. Redis数据库特性分析[J]. 物联网技术, 2015(3):105-106.
    [2] 曾超宇,李金香. Redis在高速缓存系统中的应用[J]. 微型机与应用, 2013, 32(12):11-13.
    [3] 杨雪婵.针对Redis主从复制[J]. 网络安全和信息化. 2017(03)
    [4] Xhan. Redis学习笔记之持久化[EP/OL]. 2011-02-07.

  • 相关阅读:
    【并查集】连接格点C++
    【拓扑排序】威虎山上的分配C++
    CF39D Cubical PlanetC++
    【拓扑排序】排队C++
    [USACO09OCT]Invasion of the Milkweed】乳草的侵占C++
    免杀常用手段
    DELPHI 线程类
    动态注册OCX
    DELPHI 常用文件路径
    套接字(TCP)
  • 原文地址:https://www.cnblogs.com/ahmao/p/13746094.html
Copyright © 2011-2022 走看看