Redis学习笔记.md

您所在的位置:网站首页 bitmaps Redis学习笔记.md

Redis学习笔记.md

#Redis学习笔记.md| 来源: 网络整理| 查看: 265

Redis学习笔记 1. 基本安装 1.1 linux安装 2. 运行redis 3. 基本知识 4. 五大数据类型 4.1 Redis-Key 4.2 String 4.3 List 4.4 Set 4.5 Hash 4.6 Zset(有序集合) 4.7 三种特殊数据类型 4.7.1 geospatial 地址位置 4.7.2 Hyperloglog 4.7.3 Bitmaps 5.事务 6. SpringBoot 整合redis 6.1 导入依赖 6.2 配置文件 6.3 基本对象 6.4 RedisTemplate源码 6.5 自定义RedisTemplate 7. 配置文件详解 8 发布订阅 9 主从复制 Redis学习笔记 1. 基本安装 1.1 linux安装

vagrant centos7虚拟机

从官网下载redis文件,将文件移动到/opt目录下解压

mv redis-6.2.7.tar.gz /opt # 移动到/opt目录下 tar -zxvf redis-6.2.7.tar.gz # 解压 yum install gcc-c++ #安装gcc cd redis-6.2.7 make # 编译 make install # 确认编译

备份和编辑redis.config文件

备份

cd /usr/local/bin/ #进入该目录 mkdir kconfig # 创建目录 cp /opt/redis-6.2.7/redis.config /usr/local/bin/kconfig # 移动到目标目录

编辑

vi kconfig/redis.config # 当前目录 /usr/local/bin/ 与kconfig同目录

开启进程守护,即可以后台运行 daemonize yes

2. 运行redis

运行命令

cd /usr/local/bin # redis-server kconfig/redis.config # 通过指定的端口运行redis-server ps -ef|grep redis # 查看redis进程

关闭服务

shutdown

3. 基本知识

redis 默认16个数据库

数据库的操作

SELECT NUMBER # 切换数据库 DBSIZE # 查看数据库大小 FLUSHALL # 清空所有数据库 FLUSHDB # 清空当前数据库

4. 五大数据类型 4.1 Redis-Key

get 获取key的值

set

move 移除key

keys * 查看所有keys当前的数据库

EXPIRE key db 设置key的过期时间

ttl key 查看key过期的剩余时间

type key 查看key数据类型

get/set

移除key

过期设置

4.2 String 127.0.0.1:6379> set k v # 设置key OK 127.0.0.1:6379> APPEND k "zsl" # 在k的内容后面添加字符串 (integer) 4 127.0.0.1:6379> EXISTS k # 查看是否存在这个key (integer) 1 127.0.0.1:6379> get k "vzsl" 127.0.0.1:6379> STRLEN k # key长度 (integer) 4 127.0.0.1:6379> ########步长 127.0.0.1:6379> set v 0 OK 127.0.0.1:6379> incr v # 自增1 (integer) 1 127.0.0.1:6379> incr v (integer) 2 127.0.0.1:6379> incrby v 10 # 自增10 (integer) 12 127.0.0.1:6379> incrby v 12 (integer) 24 ###### 字符串范围获取 GETRANGE 127.0.0.1:6379> set name zsls OK 127.0.0.1:6379> getrange name 0 2 # 获取第一个字符串到第三个 "zsl" 127.0.0.1:6379> ###### ############### 127.0.0.1:6379> set k zsllovepjh OK 127.0.0.1:6379> get zslloveph (nil) 127.0.0.1:6379> get k "zsllovepjh" 127.0.0.1:6379> setrange k 1 ZSL # 替换指定位置开始的字符串 (integer) 10 127.0.0.1:6379> get k "zZSLovepjh" ############### ############# 127.0.0.1:6379> set k1 zero OK 127.0.0.1:6379> FLUSHALL OK 127.0.0.1:6379> setex k 20 zero # 设置过期时间 设置k的值为zero 过期时间为20s OK 127.0.0.1:6379> get k "zero" 127.0.0.1:6379> ttl k (integer) 14 127.0.0.1:6379> setnx mk zero # 不存在再进行设置 (integer) 1 127.0.0.1:6379> keys * 1) "mk" 127.0.0.1:6379> setnx mk "zs" # 如果存在则设置失败 (integer) 0 ############# ##############################原子性操作 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 设置多个key的值 OK 127.0.0.1:6379> keys * 1) "k1" 2) "k3" 3) "k2" 127.0.0.1:6379> mget k1 k2 k3 # 获取多个key的值 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> msetnx k1 vv1 k4 v4 k5 v5 # 其中一个key设置失败,则都失败,反之都成功 (integer) 0 127.0.0.1:6379> keys * 1) "k1" 2) "k3" 3) "k2" 4) "mk" 127.0.0.1:6379> get k4 (nil) 127.0.0.1:6379> ############################## 127.0.0.1:6379> mset user:1:name zsl user:1:age 21 #设置对象 set key:{id}:{field} OK 127.0.0.1:6379> keys * 1) "user:1:name" 2) "user:1:age" 127.0.0.1:6379> mget user:1:name user:1:age 1) "zsl" 2) "21" 127.0.0.1:6379> ############################## getset # 先get再set 127.0.0.1:6379> getset k1 12 (nil) 127.0.0.1:6379> get k1 "12" 4.3 List

基本的数据类型,列表。

基本命令

LPUSH KEY VLUE

LRANGE KEY START END

127.0.0.1:6379> LPUSH list one # 将值存入列表 (将一个值或者多个值插入到列表头部) (integer) 1 127.0.0.1:6379> LPUSH list two (integer) 2 127.0.0.1:6379> LPUSH list three (integer) 3 127.0.0.1:6379> LRANGE list 0 -1# 取0到最后一个位置的值 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> LRANGE list 0 1 # 取0-1位置的值 1) "three" 2) "two" 127.0.0.1:6379> RPUSH list right # 从尾部插入值 (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 1) "three" 2) "two" 3) "one" 4) "right" 127.0.0.1:6379> lrange l 0 -1 1) "4" 2) "3" 3) "2" 4) "1" 127.0.0.1:6379> LPOP list 2 #从头部位置开始弹出 2 个元素 1) "4" 2) "3" 127.0.0.1:6379> lrange list 0 -1 1) "2" 2) "1" 127.0.0.1:6379> lindex list 1 # 取下标为1的值 "1" 127.0.0.1:6379> lrem l 1 2 # 移除列表中一个为2的值 (integer) 1 127.0.0.1:6379> lrange l 0 -1 1) "3" 2) "1" ################################################## ltrim 127.0.0.1:6379> lrange list 0 -1 1) "1" 2) "2" 3) "3" 4) "4" 127.0.0.1:6379> LTRIM list 1 2 # 通过下标截取指定的长度。 OK 127.0.0.1:6379> LRANGE list 0 -1 1) "2" 2) "3" ##################################################### rpoplpush # 移除列表最后一个元素,将他移动到新的列表中! 127.0.0.1:6379> lpush list 1 (integer) 1 127.0.0.1:6379> lpush list 2 (integer) 2 127.0.0.1:6379> lpush list 3 (integer) 3 127.0.0.1:6379> lpush list 4 (integer) 4 127.0.0.1:6379> rpoplpush list mylist # 将list最后一个元素移动到mylist列表下,并在list列表中移除该元素 "1" 127.0.0.1:6379> lrange mylist 0 -1 1) "1" 127.0.0.1:6379> lrange list 0 -1 1) "4" 2) "3" 3) "2" # lset 指定下标的值。 127.0.0.1:6379> lset list 2 4 OK 127.0.0.1:6379> lrange list 0 -1 1) "4" 2) "3" 3) "4" ############################################# 127.0.0.1:6379> LRANGE list 0 -1 1) "4" 2) "3" 3) "4" 127.0.0.1:6379> linsert list before 4 before # 在指定元素值前面插入新的元素 (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 1) "before" 2) "4" 3) "3" 4) "4" 127.0.0.1:6379> LINSERT list after 4 after # 在指定元素值后面插入新的元素 (integer) 5 127.0.0.1:6379> LRANGE list 0 -1 1) "before" 2) "4" 3) "after" 4) "3" 5) "4"

小结

实际上是一个链表,before、after、left、right 如果key不存在,创建新的链表 如果key存在,新增新内容 如果移除了所有值,空链表,也代表不存在! 在俩边插入或者改动值,效率最高!中间元素,相对来说效率低一点。 4.4 Set

集合的元素是唯一不重复的。

127.0.0.1:6379> sadd set 1 # 集合添加元素 (integer) 1 127.0.0.1:6379> sadd set 12 (integer) 1 127.0.0.1:6379> sadd set 123 (integer) 1 127.0.0.1:6379> SMEMBERS set 1) "1" 2) "12" 3) "123" 127.0.0.1:6379> SISMEMBER set 1 # 判断元素是否在集合set里 (integer) 1 127.0.0.1:6379> SISMEMBER set 12 (integer) 1 127.0.0.1:6379> SISMEMBER set 122 (integer) 0 127.0.0.1:6379> scard set # 获取set的元素数量 (integer) 3 127.0.0.1:6379> SRANDMEMBER set 1 # 随机抽选出指定个数的元素 1) "123" 127.0.0.1:6379> SRANDMEMBER set 1 1) "123" 127.0.0.1:6379> SRANDMEMBER set 1 1) "1" 127.0.0.1:6379> spop set # 随机弹出元素/也可以随机弹出指定个数的元素 "2" 127.0.0.1:6379> spop set "4" 127.0.0.1:6379> SMEMBERS set 1) "1" 2) "3" 127.0.0.1:6379> sadd set1 zsl (integer) 1 127.0.0.1:6379> sadd set2 pjh (integer) 1 127.0.0.1:6379> SMOVE set1 set2 zsl # 将set1的“zsl”元素移动到set2 (integer) 1 127.0.0.1:6379> SMEMBERS set2 1) "zsl" 2) "pjh" 127.0.0.1:6379> SMEMBERS set1 (empty array) 127.0.0.1:6379> sadd s1 1 (integer) 1 127.0.0.1:6379> sadd s1 2 (integer) 1 127.0.0.1:6379> sadd s1 3 (integer) 1 127.0.0.1:6379> sadd s2 1 (integer) 1 127.0.0.1:6379> sadd s2 4 (integer) 1 127.0.0.1:6379> SDIFF s1 s2 # 差集 1) "2" 2) "3" 127.0.0.1:6379> SINTER s1 s2 # 交集 1) "1" 127.0.0.1:6379> SUNION s1 s2 # 并集 1) "1" 2) "2" 3) "3" 4) "4" 4.5 Hash

Map集合,key-map!

127.0.0.1:6379> hset map name zsl # 设置一个具体的key-value (integer) 1 127.0.0.1:6379> hget map name # 获取map的一个字段值 "zsl" 127.0.0.1:6379> hmset map age 22 sex man # 设置多个值 OK 127.0.0.1:6379> hmget map name age sex # 获取多个字段的值 1) "zsl" 2) "22" 3) "man" 127.0.0.1:6379> hgetall map # 获取map中所有的key和value 1) "name" 2) "zsl" 3) "age" 4) "22" 5) "sex" 6) "man" 127.0.0.1:6379> hdel map age # 删除指定的字段 (integer) 1 127.0.0.1:6379> hgetall map 1) "name" 2) "zsl" 3) "sex" 4) "man" 127.0.0.1:6379> hlen map # 获取map的字段个数 (integer) 2 127.0.0.1:6379> HEXISTS map age # 查看字段是否存在 (integer) 0 127.0.0.1:6379> HEXISTS map name (integer) 1 127.0.0.1:6379> hvals map # 获取所有值 1) "zsl" 2) "man" 127.0.0.1:6379> hkeys map # 获取所有字段 1) "name" 2) "sex" 127.0.0.1:6379> hsetnx map age 22 # 如果不存在age,则创建age,否则失败 (integer) 1 127.0.0.1:6379> hsetnx map age 22 # (integer) 0 127.0.0.1:6379> hgetall map 1) "name" 2) "zsl" 3) "sex" 4) "man" 5) "number" 6) "14" 7) "age" 8) "22"

小结

hash适合于对象的存储,String更加适合字符串存储!

4.6 Zset(有序集合) 127.0.0.1:6379> zadd zset 1 one 2 two 3 three # 设置多个值 (integer) 3 127.0.0.1:6379> arange 0 -1 (error) ERR unknown command `arange`, with args beginning with: `0`, `-1`, 127.0.0.1:6379> zrange zset 0 -1 1) "one" 2) "two" 3) "three" 127.0.0.1:6379> zadd salary 50000 zsl 5000 pjh 1 zzz (integer) 3 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 显示全部数据,从小到大排序 1) "zzz" 2) "pjh" 3) "zsl" 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 显示全部数据,从小到大排序 并显示scores 1) "zzz" 2) "1" 3) "pjh" 4) "5000" 5) "zsl" 6) "50000" 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 6000 withscores # 指定区间有序显示数据,并显示scores 1) "zzz" 2) "1" 3) "pjh" 4) "5000" 127.0.0.1:6379> zrange salary 0 -1 1) "zzz" 2) "pjh" 3) "zsl" 127.0.0.1:6379> ZREM salary zzz # 移除 (integer) 1 127.0.0.1:6379> zrange salary 0 -1 1) "pjh" 2) "zsl"

小结

案例思路:set 排序、存储班级成绩表、工资表排序

普通消息:1.重要消息 2. 带权重进行判断。

排行榜应用实现,Top N

4.7 三种特殊数据类型 4.7.1 geospatial 地址位置 127.0.0.1:6379> geoadd china:city 116.40 39.90 bj # 添加地理位置 (integer) 1 127.0.0.1:6379> geoadd china:city 121.47 31.23 sh 106.50 29.53 cq 120.16 30.24 hz (integer) 3 127.0.0.1:6379> geopos china:city bj sh # 获取地理位置 1) 1) "116.39999896287918091" 2) "39.90000009167092543" 2) 1) "121.47000163793563843" 2) "31.22999903975783553"

GEODIST

俩地之间的距离

127.0.0.1:6379> geopos china:city bj sh 1) 1) "116.39999896287918091" 2) "39.90000009167092543" 2) 1) "121.47000163793563843" 2) "31.22999903975783553" 127.0.0.1:6379> geodist china:city bj sh # 查询北京与上海俩个城市的距离默认 m "1067378.7564" 127.0.0.1:6379> geodist china:city bj sh km "1067.3788" 127.0.0.1:6379> geodist china:city bj sh ft "3501898.8071" 127.0.0.1:6379> geodist china:city bj sh mi "663.2401"

GEORADIUS

127.0.0.1:6379> GEORADIUS china:city 110 30 500 k withcoord (error) ERR unsupported unit provided. please use m, km, ft, mi 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord 1) 1) "cq" 2) 1) "106.49999767541885376" 2) "29.52999957900659211" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord withdist 1) 1) "cq" 2) "341.9374" 3) 1) "106.49999767541885376" 2) "29.52999957900659211" 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord withdist count 1 1) 1) "cq" 2) "341.9374" 3) 1) "106.49999767541885376" 2) "29.52999957900659211"

GEORADIUSBYMEMBER

# 找出指定位置元素周围的其它元素 127.0.0.1:6379> GEORADIUSBYMEMBER china:city bj 1000 km 1) "bj" 127.0.0.1:6379> GEORADIUSBYMEMBER china:city bj 10000 km 1) "cq" 2) "hz" 3) "sh" 4) "bj" 127.0.0.1:6379> GEORADIUSBYMEMBER china:city bj 10000 km withdist 1) 1) "cq" 2) "1464.0708" 2) 1) "hz" 2) "1127.3378" 3) 1) "sh" 2) "1067.3788" 4) 1) "bj" 2) "0.0000"

GEOHASH 返回一个或者多个位置元素的Geohash表示

127.0.0.1:6379> geohash china:city bj cq # 1) "wx4fbxxfke0" 2) "wm5xzrybty0"

底层原理:是zset,所有我们可以用zset命令来操作geo

127.0.0.1:6379> zrange china:city 0 -1 1) "cq" 2) "hz" 3) "sh" 4) "bj" 127.0.0.1:6379> zrem china:city cq (integer) 1 127.0.0.1:6379> zrange china:city 0 -1 1) "hz" 2) "sh" 3) "bj" 4.7.2 Hyperloglog

基数概念

A{1,3,5,7} B{1,3,4,6}

基数(不重复的元素) = 2

简介

用于基数统计的算法!

优点:占用的内存是固定,2^64不同的元素技术,只需要12KB内存。

应用场景:网页的UV(一个人访问一个网站多次,但是还是算作一个人!)

使用

127.0.0.1:6379> PFADD key a b c d e e f # 创建一组元素 (integer) 1 127.0.0.1:6379> pfcount key # 统计 key 元素的基数数量 (integer) 6 127.0.0.1:6379> PFADD key1 a c s o p s d f (integer) 1 127.0.0.1:6379> PFCOUNT key1 (integer) 7 127.0.0.1:6379> PFMERGE keey3 key key1 # 合并key key1到keey3 OK 127.0.0.1:6379> PFCOUNT keey3 (integer) 9 4.7.3 Bitmaps

位存储

统计用户信息,活跃,不活跃!登录,不登陆!只要是俩个状态的都可以使用Bitmaps

测试

127.0.0.1:6379> setbit sign 0 0 # 周一 未打卡 (integer) 0 127.0.0.1:6379> setbit sign 1 1 # 打卡 (integer) 0 127.0.0.1:6379> setbit sign 2 0 (integer) 0 127.0.0.1:6379> setbit sign 3 0 (integer) 0 127.0.0.1:6379> setbit sign 4 0 (integer) 0 127.0.0.1:6379> setbit sign 5 1 (integer) 0 ################################## # 查看打卡 127.0.0.1:6379> getbit sign 5 (integer) 1 127.0.0.1:6379> getbit sign 4 (integer) 0 127.0.0.1:6379> bitcount sign # 统计打卡天数 (integer) 2 5.事务

简介

本质:是一组redis命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!一次性、顺序性、排他性!

==redis 事务没有隔离级别的概念==

==Redis单条命令式保存原子性的,但是事务不保证原子性==

测试

127.0.0.1:6379> multi # 开启事务 OK 127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> get k2 QUEUED 127.0.0.1:6379(TX)> get k1 QUEUED 127.0.0.1:6379(TX)> exec # 执行事务 1) OK 2) OK 3) "v2" 4) "v1" 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> DISCARD # 取消事务 OK 127.0.0.1:6379> get k2 (nil)

命令错误,事务中所有命令都不会被执行

127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set k 1 QUEUED 127.0.0.1:6379(TX)> set k2 2 QUEUED 127.0.0.1:6379(TX)> setget k2 12 (error) ERR unknown command `setget`, with args beginning with: `k2`, `12`, 127.0.0.1:6379(TX)> exec (error) EXECABORT Transaction discarded because of previous errors.

事务队列存在语法性,那么执行命令的时候,其它命令是可以正常执行的,错误命令抛出错误!

127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set k1 v1 QUEUED 127.0.0.1:6379(TX)> set k2 2 QUEUED 127.0.0.1:6379(TX)> incr k1 QUEUED 127.0.0.1:6379(TX)> get k1 QUEUED 127.0.0.1:6379(TX)> exec 1) OK 2) OK 3) (error) ERR value is not an integer or out of range 4) "v1"

监控

悲观锁:

认为什么时候都会出现问题,无论做什么都会加锁!

乐观锁:

认为什么时候都不会出现问题,所有不会上锁!更新数据的时候去判断在此期间是否有人修改过这个数据, 获取version 更新时比较version

redis 监视测试

127.0.0.1:6379> set money 100 OK 127.0.0.1:6379> set out 0 OK 127.0.0.1:6379> watch money # 监视money OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> DECRBY money 20 QUEUED 127.0.0.1:6379(TX)> INCRBY out 20 QUEUED 127.0.0.1:6379(TX)> get money QUEUED 127.0.0.1:6379(TX)> get out QUEUED 127.0.0.1:6379(TX)> exec 1) (integer) 80 2) (integer) 20 3) "80" 4) "20"

多线程测试

线程1:

127.0.0.1:6379> watch money OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> decrby money 300 QUEUED 127.0.0.1:6379(TX)> incrby out 300 QUEUED 127.0.0.1:6379(TX)> exec # 失败 (nil)

线程2:

127.0.0.1:6379> get money "1080" 127.0.0.1:6379> set money 3000 OK 127.0.0.1:6379> unwatch # 如果事务执行失败,先解锁 OK 127.0.0.1:6379> watch money # 获取最新的值,再次监视 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> decrby money 300 QUEUED 127.0.0.1:6379(TX)> incrby out 300 QUEUED 127.0.0.1:6379(TX)> exec # 对比监视的值是否发生变化,如果没有变化,那么可以执行成功,如果变了就执行失败 1) (integer) 2700 2) (integer) 320 6. SpringBoot 整合redis

spring2.x之后,原来使用的jedis被替换为lettuce

俩者区别

jedis:采用直连,多个线程操作是不安全的,如果想要避免不安全,使用jedis pool连接池!更像BIO模式

lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况!可以减少线程数据,像NIO模式

源码解析

@Bean @ConditionalOnMissingBean( name = {"redisTemplate"} ) public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { // 默认的RedisTemplate 没有过多的设置,redis对象都是需要序列化。 RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean @ConditionalOnMissingBean // String 类型是redis常见使用的类型,所以说单独提出来一个bean! public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; }

整合测试一下

6.1 导入依赖 org.springframework.boot spring-boot-starter-data-redis 2.3.12.RELEASE 6.2 配置文件 # springboot 所有配置类,都有一个自动配置类 RedisAutoConfiguration # 自动配置类都会绑定一个 properties 配置文件 RedisProperties # 配置redis spring.redis.host=127.0.0.1 spring.redis.port=6379 6.3 基本对象 // redisTemplate 操作不同的数据类型,api和我们的指令是一样的 // opsForValue 操作字符串 String类型 // opsForList 操作 List // opsForSet 操作 Set // opsForHash 操作 Hash // opsForZSet 操作 ZSet // opsForGeo 操作 Geo // opsForHyperLogLog 操作 hyperLogLog 6.4 RedisTemplate源码 // 序列化配置 @SuppressWarnings("rawtypes") private @Nullable RedisSerializer keySerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer valueSerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashKeySerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashValueSerializer = null; if (defaultSerializer == null) { //默认jdk序列化 defaultSerializer = new JdkSerializationRedisSerializer( classLoader != null ? classLoader : this.getClass().getClassLoader()); } 6.5 自定义RedisTemplate package com.zsl.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.net.UnknownHostException; import java.util.Objects; /** * @author m1767 */ @Configuration @SuppressWarnings("all") public class RedisConfig { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException{ RedisTemplate template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); // json 序列化配置 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // String 的列序化 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key 采用String 的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key 进行String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value 序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash 的 value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } } 7. 配置文件详解

单位

大小写不敏感

包含=>可以包含其它配置文件

网络:bind ip 绑定ip ;protected-mode yes 保护模式;port 6379 端口设置

通用设置GENERAL

daemonize yes # 以守护进程的方式运行,默认是no pidfile /var/run/redis_6379.pid # 如果以后台的方式运行,我们就需要指定一个pid文件 # 日志 # Specify the server verbosity level. # This can be one of: # debug (a lot of information, useful for development/testing) # verbose (many rarely useful info, but not a mess like the debug level) # notice (moderately verbose, what you want in production probably) # warning (only very important / critical messages are logged) loglevel notice logfile "" #日志的文件位置名 database 16 # 数据库数量,默认16 always-show-logo yes #是否显示logo

快照

持久化,在规定的时间内,执行了多少次长操作,则会持久化到文件.rdb.aof

save 3600 1 # 如果3600s内,至少有一个key进行了修改,就进行持久化操作 save 300 100 save 60 10000 stop-writes-on-bgsave-error yes # 持久化如果出错,是否还需要继续工作 rdbcompression yes # 是否压缩 rdb 文件,开启则会消耗一些 cpu 资源 rdbchecksum yes # 保存rdb文件的时候,进行错误的检查校验! dir ./ # rdb 文件 保存的目录

REPLICATION 主从复制

SECURITY 安全

config get requirepass # 查看 redis 密码 config set requirepass "123456" # 设置 redis 密码

限制CLIENTS

maxclients 10000 # 设置连接redis的最大客户端的数量。 maxmemory # 配置最大的内存容量。 maxmemory-policy noeviction # 内存到达上限之后的处理策略。 # volatile-lru 只对设置过期时间的key进行LRU(默认值)。 # allkeys-lru 删除lru算法的key。 # volatile-random 随机删除即将过期的key。 # allkeys-random 随机删除。 # volatile-ttl 删除即将过期的。 # noeviction 永不过期,返回错误。

APPEND ONLY 模式

appendonly no # 默认是不开启aof模式的,默认是使用 rdb 方式 appendfilename "appendonly.aof" # 持久化的文件的名字 appendfsync everysec # 每秒执行一次 sync,可能会丢失1s的数据 # appendfsync no # 不执行 sync ,操作系统自己同步数据,速度最快 # appendfsync always # 每次修改都会 sync。消耗性能。 8 发布订阅

Redis 发布订阅是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。

127.0.0.1:6379> SUBSCRIBE zsl # 订阅频道 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "zsl" 3) (integer) 1 1) "message" 2) "zsl" 3) "\xe4\xbd\xa0\xe5\xa5\xbd" 1) "message" 2) "zsl" 3) "zero" 127.0.0.1:6379> PUBLISH zsl "你好" # 发布消息在zsl 频道中 (integer) 1 127.0.0.1:6379> PUBLISH zsl "zero" (integer) 1 9 主从复制

主从复制:是指将一台Redis服务的数据,复制到其他Redis服务器上。前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能从主节点到从节点。

默认情况下,每一台Redis服务都是主节点,一个主节点可以有多个从节点(也可以没有),但一个从节点只能有一个主节点。

使用主从复制的作用

1,数据冗余,实现数据的热备份,这也是持久化实现的另一种方式。

2,针对单机故障问题,一个节点故障,其他节点可以提供服务,不影响用户使用。实现了快速恢复故障,这也是服务冗余。

3,读写分离,master服务主要用来写,slave服务主要用来读数据。可以提高服务器的负载能力,可以根据需求的变化,添加从节点的数量。

4,负载均衡,同时配合读写分离,由主节点提供写服务,从节点提供读服务,分担服务器的负载。在写少读多的情况下,通过多个从节点分担读负载,能够大大提高Redis服务的并发量和负载。

5,高可用的基石,主从复制是哨兵和集群模式能够实施的基础。

配置环境

127.0.0.1:6379> info replication # 查看信息 # Replication role:master connected_slaves:0 master_failover_state:no-failover master_replid:222aa1f3bbf89ccd2edcea8a2734176e79c79695 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0

修改配置文件

修改端口 修改pid 修改log文件名字 dump.rdb名字

修改完毕之后,启动服务

[root@localhost kconfig]# ps -ef|grep redis root 1229 1 0 15:24 ? 00:00:00 redis-server 127.0.0.1:6379 root 1239 1 0 15:24 ? 00:00:00 redis-server 127.0.0.1:6380 root 1245 1 0 15:24 ? 00:00:00 redis-server 127.0.0.1:6381


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3