04- Redis

NoSQL

百度百科

​ NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

非关系型数据库的特点

数据模型比较简单 (没有数据表与表之间的关系)

需要灵活性更强的IT系统 ()

对数据库性能要求较高 (缓存 )

不需要高度的数据一致性 (关系型数据库数据 事务安全性较高, 非关系型较差)

优点

对数据高并发读写  (非关系型数据,基于内存存储数据, 读写效率高)
对海量数据的搞笑存储和访问
对数据的高扩展性和高可用性

高扩展性

一台主要服务器
	其他几个从属的服务器
	主服务器可读写, 从服务器 只支持读操作
	(服务器集群, 当集群中服务器中的内存空间不够用了, 可以直接在集群中添加新的服务器存储空间)

高可用

集群中的服务器, 当某一台服务器宕机不可用之后, 可以直接由新的备用机来取代

高可靠

数据不会产生丢失现象, 但是redis 是基于内存的, 当服务器一断电, 内存会被清空. 所以需要保证内存中的数据和磁盘中的数据的同步保存

Redis 概述

开发中的需求

	在开发网站的时候如果有一些数据在短时间之内不会发生变化,而它们还要被频繁的访问,为了提高用户的请求速度和降低网站的负载,就把这些数据放到一个读取速度更快的介质上(或者是通过较少的计算量就可以获得该数据),该行为就称作对该数据的缓存。该介质可以是文件、数据库、内存,内存经常用于数据缓存。

redis是什么

百度百科

	是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

优势

Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置,正因为这样,Redis才能实现持久化。

Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。

- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

redis 三种集群策略

主从形式 (读写分离)

主节点和从节点 
只有一台机器可写
	另外的机器只读
这种策略的问题是, 当主节点出现问题的时候, 项目无法写入的问题

哨兵形式

衍生出另外的哨兵节点  (实现了高可用状态)
哨兵服务器会监控其他服务器, 
	当主节点出现问题的时候, 
	会在其他从节点中找出一台服务器切换为主服务器,
	当主服务器修复完成之后, 自动作为从节点添加回当前集群中

集群模式

支持多主多从
	当有大量数据需要服务器处理的时候, 多台主服务器可以均摊服务器的压力, 
	当有一台主服务器出现问题的时候, 其他服务器自动承担更多压力

持久化策略(高可靠)

redis 是以简单的 键值对的方式存储数据的.

为了保证 数据的高可靠性, redis 必须周期性的把数据存储到 硬盘中

redis 由两种数据同步的方式

RDB 周期性 , 每隔一段时间, 保存一次数据

AOF 只要执行增删改操作, 执行日志操作 , 当服务器出现问题的时候, 可以通过日志文件来恢复数据

	AOF持久化,默认是关闭的,默认是打开RDB持久化
	appendonly yes,可以打开AOF持久化机制,在生产环境里面,一般来说AOF都是要打开的,除非你说随便丢个几分钟的数据也无所谓
	打开AOF持久化机制之后,redis每次接收到一条写命令,就会写入日志文件中,当然是先写入os cache的,然后每隔一定时间再fsync一下
	而且即使AOF和RDB都开启了,redis重启的时候,也是优先通过AOF进行数据恢复的,因为aof数据比较完整
	可以配置AOF的fsync策略,有三种策略可以选择,一种是每次写入一条数据就执行一次fsync; 一种是每隔一秒执行一次fsync; 一种是不主动执行fsync
	always: 每次写入一条数据,立即将这个数据对应的写日志fsync到磁盘上去,性能非常非常差,吞吐量很低; 确保说redis里的数据一条都不丢,那就只能这样了

mysql -> 内存策略,大量磁盘,QPS到多少,一两k。QPS,每秒钟的请求数量
redis -> 内存,磁盘持久化,QPS到多少,单机,一般来说,上万QPS没问题

Redis 环境搭建

Windows 环境

运行服务端

这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。

切换到redis目录下运行 redis-cli.exe 。

C:\redis>redis-cli.exe

127.0.0.1:6379> ping
PONG

以上说明我们已经成功安装了redis。

linux 环境

上传文件

目录位置为 /usr/local/

解压文件

tar -zxvf redis-5.0.4.tar.gz

进入目录并编译

 cd redis-5.0.4
 make

完成安装

进入src 目录
cd src 
make install

统一管理配置文件和常用命令

创建两个新文件夹

mkdir /usr/local/redis/etc
mkdir /usr/local/redis/bin

移动配置文件到etc

mv /usr/local/redis-5.0.4/redis.conf /usr/local/redis/etc/

移动常用命令到bin (进入到src 目录中)

cd /usr/local/redis-5.0.4/src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server /usr/local/redis/bin/

配置redis 后台启动

cd /usr/local/redis/etc/
vim redis.conf

修改 daemonize 属性的值为 yes

启动 redis 服务

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

查看端口号

ps -ef | grep redis

配置redis 服务开机启动

vim /etc/rc.local

添加配置文件内容为 redis 的启动命令

touch /var/lock/subsys/local
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

允许外部机器连接

(1)修改redis.conf 文件,把bind 127.0.0.1 这一行注释掉。
(2)修改redis.conf 文件,protected-mode 要设置成no
(3)启动的时候,需要指定redis.conf 文件,执行命令
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

redis 重启服务

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
// 或者使用终极武器
pkill redis-server
// 或者
kill 进程号

防火墙配置

/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT 
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
/etc/rc.d/init.d/iptables status

使用Xshell 工具远程连接

/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379

桌面管理工具

安装Redis

redis 基本命令

set 键 值

get 键

keys *

通配符 含义
? 匹配一个字符
* 匹配任意个字符
[] 匹配括号中, 范围内的任意一个字符
\ 转义字符

exists 键

del 键

type 键

help

数据类型

redis 多数据库支持

Redis 默认支持16 个数据库, 命名方式 为 0-15
可以通过参数修改默认数据库的个数
客户端连接 redis 之后 自动选择 0 号数据库
可以通过 select 命令更换数据库 (select 1 )

字符串

get set
mset / mget

incr (自增长)
incrby 指定步长 增长
decr 自减
decrby  
append 向尾部追加值
strlen 获取字符串长度

管理字符串的基本命令

序号 命令 说明
1 SET key value 此命令设置指定键的值。
2 GET key 获取指定键的值。
3 GETRANGE key start end 获取存储在键上的字符串的子字符串。
4 GETSET key value 设置键的字符串值并返回其旧值。
5 GETBIT key offset 返回在键处存储的字符串值中偏移处的位值。
6 MGET key1 [key2…] 获取所有给定键的值
7 SETBIT key offset value 存储在键上的字符串值中设置或清除偏移处的位
8 SETEX key seconds value (expired) 使用键和到期时间来设置值
9 SETNX key value (not exists) 设置键的值,仅当键不存在时
10 SETRANGE key offset value 在指定偏移处开始的键处覆盖字符串的一部分
11 STRLEN key 获取存储在键中的值的长度
12 MSET key value [key value …] 为多个键分别设置它们的值
13 MSETNX key value [key value …] 为多个键分别设置它们的值,仅当键不存在时
14 PSETEX key milliseconds value 设置键的值和到期时间(以毫秒为单位)
15 INCR key 将键的整数值增加1
16 INCRBY key increment 将键的整数值按给定的数值增加
17 INCRBYFLOAT key increment 将键的浮点值按给定的数值增加
18 DECR key 将键的整数值减1
19 DECRBY key decrement 按给定数值减少键的整数值
20 APPEND key value 将指定值附加到键

列表类型(List)

127.0.0.1:6379[2]> lpush list zhangsan lisi wangwu zhaoliu
(integer) 4
127.0.0.1:6379[2]> lrange list 0 10
1) "zhaoliu"
2) "wangwu"
3) "lisi"
4) "zhangsan"

常用命令

序号 命令 说明
1 BLPOP key1
[key2 ] timeout
移出并获取列表的第一个元素,
如果列表没有元素会阻塞列表
直到等待超时或发现可弹出元素为止。
2 BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素,
如果列表没有元素会阻塞列表
直到等待超时或发现可弹出元素为止。
3 BRPOPLPUSH source destination timeout 从列表中弹出一个值,
将弹出的元素插入到另外一个列表中并返回它;
如果列表没有元素会阻塞列表
直到等待超时或发现可弹出元素为止。
4 LINDEX key index 通过索引获取列表中的元素
5 LINSERT key BEFORE AFTER pivot value
6 LLEN key 获取列表长度
7 LPOP key 移出并获取列表的第一个元素
8 LPUSH key value1 [value2] 将一个或多个值插入到列表头部
9 LPUSHX key value 将一个值插入到已存在的列表头部
10 LRANGE key start stop 获取列表指定范围内的元素
11 LREM key count value 移除列表元素
12 LSET key index value 通过索引设置列表元素的值
13 LTRIM key start stop 对一个列表进行修剪(trim),
就是说,让列表只保留指定区间内的元素,
不在指定区间之内的元素都将被删除。
14 RPOP key 移除并获取列表最后一个元素
15 RPOPLPUSH source destination 移除列表的最后一个元素,
并将该元素添加到另一个列表并返回
16 RPUSH key value1 [value2] 在列表中添加一个或多个值
17 RPUSHX key value 为已存在的列表添加值

set

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

常用命令

序号 命令 描述
1 SADD key member1 [member2] 向集合添加一个或多个成员
2 SCARD key 获取集合的成员数
3 SDIFF key1 [key2] 返回给定所有集合的差集
4 SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
5 SINTER key1 [key2] 返回给定所有集合的交集
6 SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
7 SISMEMBER key member 判断 member 元素是否是集合 key 的成员
8 SMEMBERS key 返回集合中的所有成员
9 SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
10 SPOP key 移除并返回集合中的一个随机元素
11 SRANDMEMBER key [count] 返回集合中一个或多个随机数
12 SREM key member1 [member2] 移除集合中一个或多个成员
13 SUNION key1 [key2] 返回所有给定集合的并集
14 SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素

有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

常用命令

序号 常用命令 描述
1 ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
2 ZCARD key 获取有序集合的成员数
3 ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
4 ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
5 ZINTERSTORE destination numkeys key [key …] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6 ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
7 ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员
8 ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
10 ZRANK key member 返回有序集合中指定成员的索引
11 ZREM key member [member …] 移除有序集合中的一个或多个成员
12 ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
13 ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
14 ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
17 ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18 ZSCORE key member 返回有序集中,成员的分数值
19 ZUNIONSTORE destination numkeys key [key …] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)

Hash数据结构

简介

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

Map<String,Map<String,String>>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VFRZpBC1-1572277934808)(04- Redis.assets/2018072900071026.png)]

语法结构

hset key field value
hset 键  属性 值
对比 
设置 学生键 name属性 值为张三
hget 键 属性
hmset 键 属性 值  [属性 值] ...
hmget 键 属性 [属性]
hgetall key(键)

获取键集或值集

hkeys 键
hvals 键

获取字段数量

hlen 键

判断是否存在

hsxists 键 属性
127.0.0.1:6379[2]> hset stu name zhangsan
127.0.0.1:6379[2]> hexists stu name
(integer) 1
字段存在 返回 1 真 , 不存在返回 0 假

选择性插入

hsetnx 键 属性 值
如果值存在, 则不执行, 值不存在则执行

自增长

hincrby per age 1
hincrby key field increment

hincrby user age 2 (user 键的 age 属性  自增 2)

删除

hdel key field [field...]

常用命令汇总

1 HDEL key field2 [field2] 删除一个或多个哈希表字段
2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
3 HGET key field 获取存储在哈希表中指定字段的值。
4 HGETALL key 获取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment
7 HKEYS key 获取所有哈希表中的字段
8 HLEN key 获取哈希表中字段的数量
9 HMGET key field1 [field2] 获取所有给定字段的值
10 HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
12 HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
13 HVALS key 获取哈希表中所有值
14 HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。

Redis之生存时间

redis 一般用于缓存, 而缓存一般都是要设置失效时间的, 到期后数据销毁

语法

expire key seconds 
设置失效时间 键 单位秒
127.0.0.1:6379[2]> set name zhangsan
OK
127.0.0.1:6379[2]> get name 
"zhangsan"
127.0.0.1:6379[2]> expire name 5
(integer) 1
127.0.0.1:6379[2]> ttl name
(integer) 2
127.0.0.1:6379[2]> ttl name
(integer) -2
127.0.0.1:6379[2]> get name
(nil)

TTL返回值:

大于0的数字:剩余生存时间,单位为秒

-1 : 没有生存时间,永久存储

-2 : 数据已经被删除

清除生存时间限制

persist key
重新设置值, 也会清除生存时间限制

redis 事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

事务是一个单独的隔离操作:

事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

语法

MULTI
多条语句代码
EXEC
当 执行 EXEC  以事务的方式 触发命令的执行

常用命令列表

序号 命令 说明
1 DISCARD 取消事务,
放弃执行事务块内的所有命令。
2 EXEC 执行所有事务块内的命令。
3 MULTI 标记一个事务块的开始。
4 UNWATCH 取消 WATCH 命令对所有 key 的监视。
5 WATCH key [key …] 监视一个(或多个) key ,
如果在事务执行之前
这个(或这些) key 被其他命令所改动,
那么事务将被打断。

redis 主从复制

​ 随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都很快,但是一定程度上也会造成一定的延时,那么为了解决访问量大的问题,通常会采取的一种方式是主从架构Master/Slave,Master 以写为主,Slave 以读为主,Master 主节点更新后根据配置,自动同步到从机Slave 节点。

配置文件

主 redis 配置无需特殊配置。

从redis配置

修改从 redis 服务器上的 redis.conf 文件,添加 slaveof 主 redisip 主 redis 端口。

salveof 192.168.3.88 6379

测试主从数据

Jedis 客户端操作

Jedis 简介

Jedis是Redis官方推荐的Java连接开发工具。要在Java开发中使用好Redis中间件,必须对Jedis熟悉才能写成漂亮的代码
	Jedis的基本使用非常简单,只需要创建Jedis对象的时候指定host,port, password即可。当然,Jedis对象又很多构造方法,都大同小异,只是对应和Redis连接的socket的参数不一样而已。简单使用如下图所示

导入依赖

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.4</version>
</dependency>

确保 redis 的服务器可以正常访问

代码案例

基本使用方式

public static void testJedis(){
    Jedis jedis = new Jedis("192.168.3.186",6379);
    jedis.set("jedis","hello");
    String name = jedis.get("jedis");
    System.out.println(name);
    jedis.close();
}

连接池方式

public static void testJedisPool(){
    // 构建连接池配置信息
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    // 设置最大连接数
    jedisPoolConfig.setMaxTotal(50);
    // 构建连接池
    JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.3.186", 6379);
    // 从连接池中获取连接
    Jedis jedis = jedisPool.getResource();
    // 读取数据
    System.out.println(jedis.get("jedis"));
    // 将连接还回到连接池中
    jedisPool.returnResource(jedis);
    // 释放连接池
    jedisPool.close();
}

SpringBoot 整合 Redis

参考文章 : https://blog.csdn.net/hellozpc/article/details/81267030#29Rediscli_99

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章