Redis进阶

Redis之父安特雷兹

redis x.x.x第二位是偶数的是稳定版本

redis7安装单机物理机安装:

https://blog.csdn.net/G189D/article/details/129185947

数据类型

bitmap

统计二值状态的数据类型

最大位数2^32位,他可以极大的节约存储空间,使用512M可以存储最多42.9亿的字节信息

setbit k1 2 1
getbit k1 2# 8位一组
strlen k1 
# 统计
127.0.0.1:6379> setbit uid:login123 1 1
(integer) 0
127.0.0.1:6379> setbit uid:login123 2 1
(integer) 0
127.0.0.1:6379> setbit uid:login123 3 1
(integer) 0
127.0.0.1:6379> bitcount uid:login123 
(integer) 3
127.0.0.1:6379> bitcount uid:login123 0 30
(integer) 3# 统计连续两天签到的用户
127.0.0.1:6379> setbit 20230101 0 1
(integer) 0
127.0.0.1:6379> setbit 20230101 1 1
(integer) 0
127.0.0.1:6379> setbit 20230101 2 1
(integer) 0
127.0.0.1:6379> setbit 20230102 1 1
(integer) 0
127.0.0.1:6379> setbit 20230102 2 1
(integer) 0
127.0.0.1:6379> bitcount 20230101
(integer) 3
127.0.0.1:6379> bitcount 20230102
(integer) 2
127.0.0.1:6379> bitop and k3 20230101 20230102
(integer) 1
127.0.0.1:6379> bitcount k3
(integer) 2

应用场景:统计用户活跃度

HyperLogLog

用来做基数统计算法,具有去重复功能统计网站UV(每天的独立访客ip唯一),PV
用户搜索网站关键词的数量
统计用户每天搜索不同词条个数# 统计 文章浏览量
127.0.0.1:6379> pfadd article:111 192.168.0.1
(integer) 1
127.0.0.1:6379> pfadd article:111 192.168.0.2
(integer) 1
127.0.0.1:6379> pfadd article:111 192.168.0.1
(integer) 0
127.0.0.1:6379> pfcount article:111
(integer) 2# 合并 两个文章的浏览量,这个合并是做了去重复操作的
127.0.0.1:6379> pfmerge distresutl article:111 article:222
127.0.0.1:6379> pfcount distresutl 
(integer) 2

GEO

摇一摇附近的妹子
附近核酸点
附近商家
附近滴滴打车GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城"
127.0.0.1:6379> type city
zset# 解决中文乱码问题
[root@ecs-56325218 ~]# redis-cli -a 111111 --raw
127.0.0.1:6379> zrange city 0 -1
天安门
故宫
长城# 返回经纬度
127.0.0.1:6379> geopos city 天安门 故宫
116.40396326780319214
39.91511970338637383
116.40341609716415405
39.92409008156928252
# hash编码
127.0.0.1:6379> geohash city 天安门 故宫
wx4g0f6f2v0
wx4g0gfqsj0
# 查询两地距离 m km 
127.0.0.1:6379> geodist city 天安门 故宫 m
998.8332
127.0.0.1:6379> geodist city 天安门 故宫 km
0.9988# 附近的人
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord withhash count 10 desc
GEORADIUSbymember city 天安门  10 km withdist withcoord withhash count 10 desc

持久化

RDB

指定时间间隔,执行数据集的时间点快照

默认自动触发(Redis7)不同之前(时间)

手动触发:调用save(阻塞,生产上禁用)命令或者bgsave(非阻塞)

关机的时候也会执行RDB

主从复制也会执行RDB

缺点:宕机可能存在数据丢失,不满足时间间隔

禁用RDB

配置文件 save ‘’

AOF

追加写操作

开启:配置文件 appendonly yes

自我优化,AOF重写(压缩文件)

回写策略:

1. Always:每步写回
1. every sec:每秒写会(默认)
1. no:写到缓冲区,具体由操作系统决定啥时写到磁盘

混合使用(生产)

AOF优先级高于RDB

1 开启混合方式设置

设置aof-use-rdb-preamble的值为 yes yes表示开启,设置为no表示禁用

2 RDB+AOF的混合方式---------> 结论:RDB镜像做全量持久化,AOF做增量持久化

先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式。----》AOF包括了RDB头部+AOF混写

前提:必须开启AOF

纯缓存模式

同时关闭RDB+AOF

关闭RDB:save ‘’

关闭AOF:appendonly no

高级篇

Redis是单线程还是多线程

redis4之后才慢慢支持多线程,直到redis6/7后才稳定

Redis是单线程

主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求包括获取(socket读)、解析、执行、内容返回(socket写)等都一个顺序串行的主线程处理,这就是所谓的单线程。这也是Redis对外提供键值存储服务的主要流程

但Redis的其他功能,比如持久化RDB、AOF、异步删除、集群数据同步等等,其实是由额外的线程执行

Redis命令工作线程是单线程,但是,整个Redis来说,是多线程

多线程的优化命令

# 删除大key
unlink key
flushdb async
flushall async

Redis性能影响因素:CPU、内存、网络IO(主要)

redis7开启多线程(默认关闭):

可以加速网络处理,提高吞吐量

io-threads 4
io-threads-do-reads yes

BigKey

# MoreKey案例
# 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中
for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;cat /tmp/redisTest.txt | /opt/redis-7.0.0/src/redis-cli -h 127.0.0.1 -p 6379 -a 111111 --pipe# 生产上限制keys * / flushdb /flushall 等危险命令的误删误用,在redis.conf的SECURITY的一项中
rename-command key ""
rename-command flushdb ""
rename-command flushall ""scan 替换 keys *
scan
sscan
hscan
zscanscan curosr [pattern] [count]# 大key查询
redis-cli --bigkeys -a 111111  或者 memory usage key
# 如何删除
string	unlink
hash		使用hscan 每次获取少量field-value,在使用hdel删除每个field
list		ltrim
set			使用sscan 每次获取少量field-value,在使用srem删除每个field
zset		使用zscan 每次获取少量field-value,在使用ZREMRANGEBYRANK删除每个field

缓存双写一致性之更新策略探讨

  1. 高并发下,双检加锁

请添加图片描述

不能保证100%

  1. 利用mq的最终一致性(个人感觉这种方案比较好)

    请添加图片描述

  2. 双写一致性canal监听

bitmap/hyperloglog/geo落地实现

hyperloglog

uv:独立访客,一般理解客户端ip(需要考虑去重)

pv:页面浏览量,不用去重

dau:日活跃用户量(登录或者是用来某个产品的用户数 去重复登录用户)

mau:月活越用户

geo

附近的人

bitmap

连续签到

最近一周的活跃用户

某个用户按照365,哪天登录过?那几天没有登录?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/22171.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万物皆可截图:SwiftUI 中任意视图(包括List和ScrollView)截图的通用实现

功能需求 在使用 SwiftUI 开发的过程中,有时我们希望能够对特定视图进行截图: 如上图所示:我们实现了 SwiftUI 5.0(iOS 17)中对任意视图(List、gif动画、ScrollView 等等)进行截图的功能。 从目前来说,大家在 SwiftUI 中截图会面临一些问题: 官方的 ImageRenderer 类…

MongoDB踩过的坑

目录 启动MongoDB服务 可视化工具&#xff1a;MongoDB Compass 由于目标计算机积极拒绝&#xff0c;无法连接 BSONObj size: xxxx is invalid. Size must be between 0 and 16793600 (16MB) 启动MongoDB服务 1. 打开CMD 2. 进入安装MongoDB文件夹中的bin目录 3. mongod -…

猜数字小游戏但多语言版本(C、Java、Golang、python、JavaScript)

文章目录 前言C语言版本语法风格应用领域C 语言实现猜数字小游戏 Java语言版本语法风格应用领域Java语言实现猜数字小游戏 GO语言版本语法风格应用领域GO语言实现猜数字小游戏 python版本语法风格应用领域python语言实现猜数字小游戏 JavaScript版本语法风格应用领域JavaScript…

Jmeter的常用设置(二)【处理乱码问题】

文章目录 前言一、察看结果树响应结果是乱码_解决方法 方法一&#xff1a;在察看结果树之前添加 后置处理器 中的 “BeanShell PostProcessor” 来动态修改结果处理编码方法二&#xff1a;在配置文件中修改二、使用步骤 1.引入库2.读入数据总结 前言 接口测试中遇到的各种问题…

【Leetcode】42.接雨水(困难)

一、题目 1、题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6…

opencv-04 像素处理

opencv-04 像素处理 在 OpenCV 中&#xff0c;最小的数据类型是无符号的 8 位数。因此&#xff0c;在 OpenCV 中&#xff0c;实际上并没有二值图像这种数据类型&#xff0c;二值图像经常是通过处理得到的&#xff0c;然后使用0表示黑色&#xff0c;使用 255 表示白色。 可以将…

数据结构初阶--排序1

目录 前言冒泡排序思路代码实现 选择排序思路代码实现 插入排序思路代码实现 希尔排序思路代码实现 堆排序思路向上调整建堆向下调整建堆 代码实现 前言 排序在我们的日常生活中无处不在&#xff0c;比如对若干个学生的期末成绩&#xff0c;可以依据姓氏&#xff0c;学号&…

C# Linq 详解二

目录 概述 七、OrderBy 八、OrderByDescending 九、Skip 十、Take 十一、Any 十二、All C# Linq 详解一 1.Where 2.Select 3.GroupBy 4.First / FirstOrDefault 5.Last / LastOrDefault C# Linq 详解二 1.OrderBy 2.OrderByDescending 3.Skip 4.Take 5.Any 6.All C#…

WebSocket从入门到精通

WebSocket 是什么&#xff1f; WebSocket是HTML5规范提出的一种协议&#xff1b;目前除了IE浏览器&#xff0c;其他浏览器都基本支持。它是一种协议&#xff0c;万变不离其宗&#xff0c;也是基于TCP协议的&#xff0c;和HTTP协议是并存的两种协议。HTML5 Web Sockets规范定义了…

SpringBoot 整合RabbitMQ

SpringBoot 整合 RabbitMQ 概念 2007 年发布&#xff0c;是一个在 AMQP(高级消息队列协议)基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;是当前最主流的消息中间件之一。 RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queue 高级消息队列协议…

gma 2 教程(二)数据操作:3. 支持生成的栅格格式信息

为了方便了解和选择输出栅格格式、配置高级创建选项&#xff0c;下表列出了gma可以生成&#xff08;复制/创建/转换&#xff09;的所有栅格格式的主要信息&#xff1a; 格式名生成模式支持数据类型扩展名多维栅格支持色彩映射表支持的数据类型多波段支持压缩模式AAIGrid复制By…

微擎后台getshell,低权限也可以

/web/index.php?csite&aeditor 这个文件可以编辑html&#xff0c;然后前台会解析成php 没测试最新版 比如编辑专题&#xff1a;/web/index.php?csite&aeditor&dopage&multiid0 上架抓包 改html内容为php 复制前台url 访问之 博客原文&#xff1a; 微擎后…