redis学习笔记

Redis
内存存储、持久化、内存中是断电即失、需要持久化(rdb、aof)
效率高、可以用于高速缓存
发布订阅系统
地图信息分析
计时器、计数器(浏览量)

特性
多样的数据类型
持久化
集群
事务
Linux安装
1、下载安装包
2、解压缩到/opt目录下
3、进入解压后的文件可以看的配置/opt/redis-5.0.8
4、基本的环境安装
yum install gcc-c++
make
5、redis的默认安装路径 /usr/local/bin
6、cp /opt/redis-5.0.8/redis.conf /usr/local/bin/redisconfig 复制redis配置文件到/usr/local/bin/redisconfig下
7、redis默认不是后台启动,修改配置文件 daemonize yes
8、启动redis服务 redis-server redisconfig/redis.conf通过指定配置文件启动服务
9、使用redis-cli客户端测试连接 redis-cli -p 6379
10、查看redis进程 ps -ef|grep redis
11、关闭redis服务 shutdown
12、集群测试,单机多服务
测试性能
redis-benchmark是一个压力测试工具
官方自带的性能测试工具
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
说明:连接当前机器,并发数100,每个10w请求

redis基本知识
redis默认有16个数据库
select 1 选择2号库
keys * 查看所以的key
flushdb 清除数据库数据
flushall 清空全部数据命令

思考:为什么redis是6379
五大数据类型
keys * 查询当前库所有key
exists key 查询指定key是否存在
move key
expire name xxx 设置失效时间
ttl key 查询当前key存储的值剩余时间
type key 查看当前存储的值类型

string(字符串)类型
set k v 设置值
get k 获取值
keys * 获取所有key
exists k 判断k对应值是否存在
append k “str” 追加key对应的值
strlen k 获取v长度
incr k 自增1
decr k 自减1
incrby k 10 步长10
decrby k 10 步长10
getrange k start end 截取字符串
setrange k offset xxx 替换指定位置的字符串
setex k v 设置过期时间
setnx k v 如果不存在就设置值
mset k1 v1 k2 v2 批量设置值
mget k1 k2 批量获取值
msetnx
getset key 先获取,再设置

List类型
LPUSH K 左边加入
RPUSH K 右边加入
LPOP K 左边获取
RPOP K 右边获取
LRANGE K 0 -1 获取某段范围的数据
LINDEX K 0 通过下标获取某一个值
LLEN 获取list的长度
lrem list 1 three 移除关注列表中的值为three的(微博取关)
ltrim list 1 2 通过下标截取指定的长度
rpoplpush list1 list2 移除list1中最后一个元素,并push到list2中
lset list 0 item 向list中的0位置更新数据为item,如果对应索引不存在,则设置失败
linsert list before “v”“v1”在v前面插入v1
linsert list after “v”“v1”在v后面插入v1

Set类型 无序不重复
sadd k v 添加
smembers k 查看所有值
sismember k v3 判断v3是否存在于k中
scard k 获取k中的值个数
srem k v 移除set中的元素v
srandmember k 随机抽选出1个元素
spop k 随机移除一个元素
smov k1 k2 v1 将k1中的元素v1移动到k2
sdiff k1 k2 取k1和k2的差集合
比如k1[a,b,c] k2[c,d,e] 则sdiff k1 k2为a,b
sinter k1 k2取k1和k2的交集(共同关注)
sunion k1 k2(合起来的粉丝)
微博,a用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中
共同关注

Hash(哈希)类型
hset k field v 设置一个具体key-value
hmset k field v1 field2 v2 set多个k-v一起设置
hget k field 获取k中的field
hgetall k 获取所有的数据
hdel k field 删除指定key字段,对应的值也就删除了
hlen k 查看hash里面的数据数目
hexists k field 判断hash中指定字段是否存在
hkeys k 只获取所有field
hvals k 只获取所有值
hincrby k field 1 对k中的field字段值增加1

hash变更的数据user,尤其是用户信息之类的,经常变动的信息。hash更适合对象的存储,
string更适合字符串的存储

Zset(有序集合)类型(在set的基础上,增加了1个值)
zadd k 1 one 添加元素one,权重为1
zrangebyscore salary -inf +inf withscores 排序升序(工资小于2500工资升序排列)
zrevrangebyscore salary 2500 -inf withscores 降序排序(工资小于2500工资降序排列)
zrem salary ctl 删除ctl值
zcard salary 获取有序集合中元素个数
zrange salary 0 -1默认从小到大
zcount k 1 2,统计数据1到2区间的值数目
案例思路:set排序 存储班级成绩表,工资表排序
普通消息:1 重要消息 2带权重进行判断
排行榜应用实现

三种特殊数据类型
geospatial
朋友的定位,附近的人,打车距离计算
geoadd添加经纬度
两极无法添加
lon经度,lat纬度
geoadd china:city 106.50 29.53 chongqing
geopos china:city shenzhen 获取深圳的经度和纬度
geodist china:city hangzhou beijing km 返回杭州到北京的距离,单位km
georadius 附近的人
georadius china:city 110 30 500 km 查询当前经纬(110,30)度班级500公里内的城市
georadius china:city 110 30 500 km withdist withcoord count 1
georadiusbymember china:city beijing 1000 km
geohash china:city beijing hangzhou 返回两个城市的经纬度的字符串表示

Hyerloglog 数据基
优点:占用的内存是固定的,2^64不同的元素的技术,只要12kb内存
A{1,3,5,7,8,7} B{1,3,5,7,8} 基数(不重复的元素)
简介 Redis基数统计的算法!
网页的UV(一个人访问一个网站多次,但是还是算作一个人!)
传统的方式,set保存用户id,然后就可以统计set中的元素数量作为标准判断
这个方式如果保存大量的用户id,就会比较麻烦。
pfadd k v v2 v3
pfcount k 统计元素的基数数量
pfmerge k k2 k2数据合并到k中
pfmerge k k2 k3 数据k2 k3 合并到k中

Bitmaps 类型
位存储
统计用户信息,活跃,不活跃,登录,未登录,打卡 ,两个状态的,都可以用bitmaos

setbit k 0 0
setbit k 1 1
setbit k 2 0

getbit k
bitcount k 统计值为1的数量

Redis基本的事务操作
ACID 原子性 一致性 隔离性 持久性
redis单条命令是保存原子性的,但是事务不保证原子性
redis事务本质:一组命令的集合!一个事务中的所有命令会被序列化,在
事务执行过程中,会按照顺序执行!一次性、顺序性、排他性!执行一些列
的命令。
Redis事务没有隔离级别的概念!
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行

redis的事务:(一次性、顺序性、排他性)
开启事务(multi)
取消事务 (discard)先开启事务,关闭事务后,前面的命令不会执行
命令入队
执行事务(exec)
正常执行事务!
事务每次使用要开启一次事务

编译型异常(命令有错),事务中所有的命令都不会被执行
运行时异常(1/0)如果事务有执行错误,跳过当前执行后面的命令

Redis乐观锁
监控!watch
乐观锁:
很乐观,认为什么时候都不会出问题,所有不会上锁。更新数据的时候去
判断一下,在此期间是否有人修改过这个数据
获取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
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec

  1. (integer) 80
  2. (integer) 20
    127.0.0.1:6379>

测试多线程修改值,使用watch可以当作redis的乐观锁操作
如果执行任务失败,要unwath解锁,再获取锁,最新的值

Jedis 官方推荐的java连接开发工具

Springboot整合Jedis 略

Redis.conf详解 启动的时候,就通过配置文件来启动!
1、配置文件 unit单位对大小写不敏感
2、include 引入文件
3、网络
bind 127.0.0.1
protected-mode yes 保护模式
port 6379
4、通用配置
daemonize yes 以守护进程的方式运行,需要开启为yes
pidfile /var/run/redis_6379.pid 如果以后台方式启动,需要指定
loglevel notice 日志4个级别

logfile “”日志的文件名
databases 16 数据库的数量,默认是16个库
always-show-logo yes 是否显示logo
5、快照
持久化,在规定的时间内,执行了多少次操作,则会持久化到文件 rdb aof
redis是内存数据库,如果没有持久化,那么数据断电丢失
//900秒(15分钟)如果至少有一个key进行了修改,就进行持久化操作
save 900 1
//300秒内如果至少10个key进行了修改,就进行持久化
save 300 10
//如果60s内,至少10000key进行了修改,就进行持久化
save 60 10000
stop-writes-on-bgsave-error yes 如果持久化失败继续进行
rdbcompression yes 是否压缩rdb文件,需要消耗一些cpu资源
rebchecksum yes 保存rdb文件的时候,检查错误校验
dir ./ rdb的保存目录

REPLICATION复制,主从复制相关的

SECURITY安全
config set requirepass 123456 设置redis的密码
auth 123456 登录进去

CLIENTES 客户端
maxclients 10000 默认最大客户端数1w个
maxmemoryredis最大内存
maxmemory-policy noeviction 内存到达上限之后的处理策略

1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)
2、allkeys-lru : 删除lru算法的key
3、volatile-random:随机删除即将过期key
4、allkeys-random:随机删除
5、volatile-ttl : 删除即将过期的
6、noeviction : 永不过期,返回错误

APPEND ONLY模式 aof配置
appendonly no 默认是不开启aof模式的,默认是使用rdb方式持久化的
appendfilename “appendonly.aof”持久化文件的名字

appendfsync always 每次修改都会 sync。消耗性能
appendfsync everysec 每秒执行一次 sync,可能会丢失这1s的数据
appendfsync no 不执行sync,这个时候操作系统自己同步数据

Redis持久化(必须要持久化),默认就是RDB模式
RDB(Redis DataBase)rdb对大数据,数据完整性不敏感的情况适用
rdb保存的文件是dump.rdb
触发机制
1 save规则满足
2 执行flushall命令
3 退出redis,也会产生rdb文件
备份就自动生成dump.rdb文件
如何恢复rdb文件
1、只需要将rdb文件放在我们启动目录就可以,redis启动的时候会自动检查
2、查看需要存在的位置 config get dir
优点:
1、适合大规模的数据恢复!dump.rdb
2、如果对数据的完整性要求不高!
缺点:
1、需要一定的时间间隔操作!如果redis意外宕机了,最后一次修改的数据就
灭有了!
2、fork进程的时候,会占用一定的内存空间!
生产环境dump.rdb数据需要备份

AOF(append only file)将我们的所有命令都记录下来,history,恢复的时候
全部执行一遍
appendfilename appendonly.aof
appendonly no 默认是不开启的,需要手动开启
重启redis就可以生效
redis-check-aof检查修复aof持久化文件
aof文件如果有问题,就启动不了redis
redis-check-aof --fix appendonly.aof 修复文件
优点:
1、每次修改都同步,文件的完整性会更好
2、每秒同步一次,可能会丢失1秒的数据
3、从不同步,效率最高
缺点:
1、相对于数据文件来说,aof远远大于rdb,修复速度比rdb慢
2、aof运行效率比rdb慢,所有默认配置的是rdb持久化!
重写规则说明
如果文件太大,fork一个新的进程进行文件重写

Redis发布订阅

消息发送者
频道
消息订阅者

subscribe ctl 订阅ctl频道
publish ctl hello 发布hello到ctl频道

Redis集群环境搭建
主从复制,读写分离!80%的情况都是读操作,最低3台服务器
数据复制是单向的,只能从主节点到从节点,master以写为主,slave以
读为主

主从复制主要包括:
数据冗余
故障恢复
负载均衡
高可用

环境配置

集群配置
cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf

vim redis6379.conf
1、端口 port 6379
2、pid名字 logfile “6379.log”
3、log文件名字 pidfile ***6379.file
4、dump.rdb名字 dump.rdb dump6379.rdb
修改完毕,启动服务
/usr/local/bin下
redis-server redisconfig/redis79.config
redis-server redisconfig/redis80.config
redis-server redisconfig/redis81.config

主从复制之复制原理
一主二从
默认情况下,每台redis服务都是主节点:只需要配置从机器
slaveof 127.0.0.1 6379 从机认6379为主机
info replication 查看主从信息
真实的主从配置应该在配置文件中,搜索关键字replication 配置
slaveof host port
主机可以写,从机不可以写,只可以读
如果主机宕机了,那么从机还是slave模式,这样需要手动设置主机
如果是使用命令行,断开重启,则从机会变成主机
复制原理

全量复制
slave启动成功连接到master后会发送一个sync同步命令,全量复制数据
增量复制
从机连接到主机后,后面都是进行增量复制的
重新连接到master,会进行一次全量复制

层次链路
上一个节点是下一个节点的主节点
如果主机端口了连接,可以使用slaveof no one变成主机,其他节点就可以连到它

哨兵模式(自动选取老大的模式)
哨兵是一个独立的进程,哨兵通过发送命令监控redis服务器是否健康
哨兵也需要配置多个哨兵,多个哨兵互相监督

主观下线----投票选举–发布消息----客观下线

哨兵模式
优点:
1、哨兵集群,基于主从模式
2、主从可以切换,故障可以转移
3、哨兵模式是主从模式的升级,从手动到自动
缺点:
1、redis不好在线扩容,集群容量一旦达到上限,在线扩容就很麻烦
2、实现哨兵模式的配置其实是很麻烦的,里面有很多选择
哨兵模式全部配置

Redis缓存穿透和雪崩

缓存穿透
布隆过滤器
缓存空对象
缓存击穿(请求量太大,缓存过期)
热点数据失效
热点数据不过期
加互斥锁,加锁保持同时只有个请求进来,其余的进行等待

缓存雪崩
某一个时间端,缓存集体失效
限流降级
数据预热

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值