redis的安装与string类型

1. redis的安装

1.1 升级gcc版本

因为centos7.x的gcc版本还是4.8.5,而编译指定的版本是需要5.3以上。

  1. 环境部署与安装scl源

yum install gcc cmake -y --部署安装环境
yum install centos-release-scl scl-utils-build -y --安装scl源
  1. 安装gcc新版本

yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils --安装gcc
​
scl enable devtoolset-9 bash  --更新gcc版本
​
gcc -v --查看gcc版本

1.2 安装redis

tar zxvf redis-6.2.6.tar.gz   --解压源码包
​
cd redis-6.2.6                --进入解压目录
​
mkdir /www/
mkdir /www/server
​
make && make install PREFIX=/www/server/redis          --执行安装命令
​
mkdir /www/server/redis/conf
cp redis.conf /www/server/redis/conf/
cp sentinel.conf /www/server/redis/conf/
vim /www/server/redis/conf/redis.conf

配置下Redis的配置文件:

protected-mode no
daemonize yes
appendonly yes
./bin/redis-server /www/server/redis/conf/redis.conf 启动redis服务
​
ps -ef | grep redis   查看redis进程
​
./bin/redis-cli   启动redis客户端
​
keys *  查看所有的key
127.0.0.1:6379> set name "starsky"
OK
127.0.0.1:6379> get name
"starsky"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> quit
​
​

2.3 配置管理shell文件

这个脚本与之前的nginx脚本一样,都是用来做管理软件之用,我们进入到目录/etc/init.d下:

touch redis

创建了文件redis之后,我们使用vim命令进行编辑写入下面的内容:

#! /bin/sh
# chkconfig: 2345 55 25
​
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAMESERVER=redis-server
NAME=redis
REDIS_BIN=/www/server/redis/bin/$NAMESERVER
CONFIGFILE=/www/server/redis/conf/$NAME.conf
PIDFILE=/var/run/redis_6379.pid
ulimit -n 8192
​
case "$1" instart)echo -n "Staring $NAME..."if [ -f $PIDFILE ]; thenmPID=`cat $PIDFILE`isStart=`ps ax | awk '{ print $1 }' | grep -e "^${mPID}$"`if [ "$isStart" != '' ]; thenecho -e "\e[31m$NAME ( pid `pidof $NAMESERVER`) already running.\e[0m"exit 1fifi$REDIS_BIN $CONFIGFILEif [ "$?" != 0 ] ; thenecho -e "\e[31mfailed\e[0m"exitelseecho -e "\e[32msuccess\e[0m"fi;;stop)echo -n "Stoping $NAME..."if [ -f $PIDFILE ];thenmPID=`cat $PIDFILE`isStart=`ps ax | awk '{ print $1 }' | grep -e "^${mPID}$"`if [ "$isStart" = '' ];thenecho -e "\e[31m$NAME is not running.\e[0m"exit 1fifimPID=`cat $PIDFILE`kill -9 $mPID
​if [ "$?" != 0 ] ; thenecho -e "\e[31mfailed. Use force-quit\e[0m"exit 1elseecho -e "\e[32mdone\e[0m"fi;;status)if [ -f $PIDFILE ];thenmPID=`cat $PIDFILE`isStart=`ps ax | awk '{ print $1 }' | grep -e "^${mPID}$"`if [ "$isStart" != '' ];thenecho -e "\e[36m$NAME ( pid `pidof $NAMESERVER`) already running.\e[0m"exit 1elseecho -e "\e[31m$NAME is stopped\e[0m"exit 0fielseecho -e "\e[31m$NAME is stopped\e[0m"exit 0fi;;restart)$0 stopsleep 1$0 start;;*)echo -e "Usage: $0 {\e[36mstart|stop|restart|status\e[0m}"exit 1;;
esac#>

测试脚本:

env: /etc/init.d/redis: 权限不够
[root@localhost init.d]# chmod 777 /etc/init.d/redis
[root@localhost init.d]# chkconfig -add /etc/init.d/redis
​
service redis start  # 启动redis
ps -ef | grep redis  # 查看redis进程是否存在,存在则已经启动
​
service redis stop   # 停止redis
ps -ef | grep redis  # 查看redis进程是否存在,不存在则已经停止
​
service redis status # 查看redis状态信息
​

2. string数据类型

2.1 类型介绍

String类型是redis的最基础的数据结构,也是最经常使用到的类型。而且其他的四种类型多多少少都是在字符串类型的基础上构建的,所以String类型是redis的基础。

string 类型的值最大能存储 512MB,这里的String类型可以是简单字符串、复杂的xml/json的字符串、二进制图像或者音频的字符串、以及可以是数字的字符串。

常用命令(不熟练的同学多练习下)

  1. set 命令

描述:该命令用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型

127.0.0.1:6379> set name starsky
OK
127.0.0.1:6379>

通过set命令给restkey这个key值绑定value,当SET在设置操作成功完成时,才返回 OK

  1. get 命令

描述:该命令用于获取指定 key 的值。如果 key不存在,返回 nil 。如果key对应储存的值不是字符串类型,返回一个错误。

127.0.0.1:6379> get name
"starsky"
127.0.0.1:6379>
  1. getset 命令

描述:该命令用于获取指定的key的旧值,然后按照新值对key进行赋值。当key中没有旧值的时候返回nil。

127.0.0.1:6379> getset name will
"starsky"
127.0.0.1:6379> get name
"will"
127.0.0.1:6379>
  1. mget 命令

描述:该命令用于返回多个key的值,当其中某一个KEY的值不存在,返回nil

127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> set sex 1
OK
127.0.0.1:6379> mget name age sex
1) "will"
2) "10"
3) "1"
127.0.0.1:6379>
  1. decr 命令

描述:对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误

127.0.0.1:6379> decr age
(integer) 9
127.0.0.1:6379> get age
"9"
127.0.0.1:6379>
  1. incr 命令

描述:对存储在指定key的数值执行原子的加1操作,如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0。如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。

127.0.0.1:6379> get age
"9"
127.0.0.1:6379> incr age
(integer) 10
127.0.0.1:6379>

更多string命令,参考这里:http://www.redis.cn/commands.html#string

2.2 string简单字符结构

2.2.1 SDS动态字符串

SDS(Simple Dynamic Strings, 简单动态字符串)是 Redis 的一种基本数据结构,主要是用于存储字符串和整数。

SDS数据结构实现(Redis3):

struct sdshdr {unsigned int len;unsigned int free;char buf[];
};

其中,buf 表示数据空间,用于存储字符串;len 表示 buf 中已占用的字节数,也即字符串长度;free 表示 buf 中剩余可用字节数。

好处

  • 用单独的变量 len 和 free,可以方便地获取字符串长度和剩余空间;

  • 内容存储在动态数组 buf 中,SDS 对上层暴露的指针指向 buf,而不是指向结构体 SDS。因此,上层可以像读取 C 字符串一样读取 SDS 的内容,兼容 C 语言处理字符串的各种函数,同时也能通过 buf 地址的偏移,方便地获取其他变量;

  • 读写字符串不依赖于 \0,保证二进制安全。

坏处

对于不同长度的字符串,没有必要使用 len 和 free 这 2 个 4 字节的变量?

4 字节的 len,可表示的字符串长度为 2^32,而在实际应用中,存放于 Redis 中的字符串往往没有这么长,因此,空间的使用上能否进一步压缩?

2.2.2 新的SDS结构

Redis 增加了一个 flags 字段来标识类型,用一个字节(8 位)来存储。

其中:前 3 位表示字符串的类型;剩余 5 位,可以用来存储长度小于 32 的短字符串。

struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 前3位存储类型,后5位存储长度 */char buf[]; /* 动态数组,存放字符串 */
};

而对于长度大于 31 的字符串,仅仅靠 flags 的后 5 位来存储长度明显是不够的,需要用另外的变量来存储。sdshdr8、sdshdr16、sdshdr32、sdshdr64 的数据结构定义如下,其中 :

  • len 表示已使用的长度

  • alloc 表示总长度

  • buf 存储实际内容

  • flags 的前 3 位依然存储类型,后 5 位则预留。

struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* 已使用长度,1字节 */uint8_t alloc; /* 总长度,1字节 */unsigned char flags; /* 前3位存储类型,后5位预留 */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* 已使用长度,2字节 */uint16_t alloc; /* 总长度,2字节 */unsigned char flags; /* 前3位存储类型,后5位预留 */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {uint32_t len; /* 已使用长度,4字节 */uint32_t alloc; /* 总长度,4字节 */unsigned char flags; /* 前3位存储类型,后5位预留 */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {uint64_t len; /* 已使用长度,8字节 */uint64_t alloc; /* 总长度,8字节 */unsigned char flags; /* 前3位存储类型,后5位预留 */char buf[];
};

Redis创建字符串流程

sds sdsnewlen(const void *init, size_t initlen) {void *sh;sds s;// 根据字符串长度计算相应类型char type = sdsReqType(initlen);// 如果创建的是""字符串,强转为SDS_TYPE_8if (type == SDS_TYPE_5 && initlen == 0) type = SDS_TYPE_8;// 根据类型计算头部所需长度(头部包含 len、alloc、flags)int hdrlen = sdsHdrSize(type);// 指向flags的指针unsigned char *fp;// 创建字符串,+1是因为 `\0` 结束符sh = s_malloc(hdrlen+initlen+1);if (sh == NULL) return NULL;if (init==SDS_NOINIT)init = NULL;else if (!init)memset(sh, 0, hdrlen+initlen+1);// s指向bufs = (char*)sh+hdrlen;// s减1得到flagsfp = ((unsigned char*)s)-1;...// 在s末尾添加\0结束符s[initlen] = '\0';// 返回指向buf的指针sreturn s;
}

创建 SDS 的大致流程是这样的:首先根据字符串长度计算得到 type,根据 type 计算头部所需长度,然后动态分配内存空间。

注意:

  1. 创建空字符串时,SDS_TYPE_5 被强制转换为 SDS_TYPE_8(原因是创建空字符串后,内容可能会频繁更新而引发扩容操作,故直接创建为 sdshdr8)

  2. 长度计算有 +1 操作,因为结束符 \0 会占用一个长度的空间。

  3. 返回的是指向 buf 的指针 s。

1.3 使用场景

  1. 限流

local function wait()ngx.sleep(1)
endfunction limit_check()local redis = require "resty.redis"local redisConnect = redis:new()local ip = "127.0.0.1"local port = 6379local password = "root"local ok , err = redisConnect:connect(ip,port)if not ok thenngx.say( '{"code": 6379,"msg": "系统错误,请稍后再试!"}',err )ngx.exit(200)returnendlocal uri = ngx.var.urilocal uriKey = "req:uri:"..urires , err = redisConnect:eval("local res , err = redis.call('incr',KEYS[1]) if res == 1 then local resexpire , err = redis.call('expire',KEYS[1],KEYS[2]) end return (res)",2,uriKey,1)if res > 5 thenreturn falseelsereturn trueend
endrestful = limit_check()
if  not restful thenngx.say( '{"code": 400,"msg": "request is error !"}' )ngx.exit(200);return
end
应用场景:

1.主页高频访问信息显示限制,例如新浪、微博大V主页显示粉丝数与微博数量

2.限流限速

3.Session集中管理

4.验证码

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

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

相关文章

还原wps纯粹的编辑功能

1.关闭稻壳模板: 1.1. 启动wps(注意不要乱击稻壳模板,点了就找不到右键菜单了) 1.2. 在稻壳模板选项卡右击:选不再默认展示 2.关闭托盘中wps云盘图标:右击云盘图标/同步与设置: 2.1.关闭云文档同步 2.2.窗口选桌面应用…

Vue2+ElementUI表单、Form组件的封装

Vue2ElementUI表单、Form组件的封装 :引言 在 Vue2 项目中,ElementUI 的 el-form 组件是常用的表单组件。它提供了丰富的功能和样式,可以满足各种需求。但是,在实际开发中,我们经常会遇到一些重复性的需求&#xff0c…

16.WEB渗透测试--Kali Linux(四)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:15.WEB渗透测试--Kali Linux(三)-CSDN博客 1.crunch简介与使用 C…

分布式CAP理论

CAP理论:一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)。是Eric Brewer在2000年提出的,用于描述分布式系统基本性质的定理。这三个性质在分布式系统…

SQLZoo:SELECT from WORLD Tutorial/zh

name continent area population gdp Afghanistan Asia 652230 25500100 20343000000 Albania Europe 28748 2831741 12960000000 … name:國家名稱 continent:洲份 area:面積 population:人口 gdp:國內生產總值 Country Profile 在這教程中,我們會使用SELECT語句&…

python pytest 最简单的接口自动化测试框架

最近由于工作的原因,需要开发一个接口自动化测试框架,使用pytest框架、数据驱动,并展示直观的测试报告。 具体的开发过程如下: 安装必要的库: pytest:用于编写和运行测试用例。requests:用于发…

FPGA静态时序分析与约束(一)、理解亚稳态

系列文章目录 FPGA静态时序分析与约束(二)、时序分析 FPGA静态时序分析与约束(三)、读懂vivado时序报告 文章目录 系列文章目录前言一、概述一、何为亚稳态?二、图解亚稳态三、什么时候亚稳态会导致系统失效&#xff…

Jsch实践(三):如何使用Jsch的ChannelShell类,在远程服务器上执行脚本命令?

如何使用Jsch的ChannelShell类,在远程服务器上执行脚本命令 要使用JSch的ChannelShell类在远程服务器上执行脚本命令,你需要创建一个shell通道,然后向这个通道的输入流发送命令,并读取输出流来获取命令的响应。下面是一个示例代码…

k8s部署hadoop

(作者:陈玓玏) 配置和模板参考helm仓库:https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop 先通过以下命令生成yaml文件: helm template hadoop pfisterer-hadoop/hadoop > hadoop.yaml用kube…

apache和tomcat的优化总结概述

一. tomcat 的优化 Tomcat 作为一款广泛使用的 Java Web 应用服务器,其性能优化可以从以下几个方面进行: ① 内存配置优化: 调整JVM堆内存大小(-Xms和-Xmx参数),以确保Tomcat在处理大量并发请求时有足够…

Unity PS5开发 天坑篇 之 申请开发者与硬件部署01

腾了好几天终于把PS5开发机调试部署成功, 希望能帮到国内的开发者, 主机游戏PlayStation/Nintendo Switch都是比较闭塞的,开发者账号是必须的。 开发环境有两个部分,一是DEV Kit 开发机, TEST Kit测试机两部分组成,二是Unity的支持库(安装后…

vue3 ref 和 reactive 区别

Vue 3 引入了两种新的响应式 API:ref 和 reactive。这两个 API 都用于创建响应式数据,但它们的使用场景和行为有所不同。 ref 用途:ref 用于创建基本数据类型的响应式引用,如字符串、数字、布尔值等。 使用方式:在模…

最新开源解密版TwoNav网址导航系统源码

源码简介 2024最新开源解密版TwoNav网址导航系统源码去授权破解版 内置二十多套主题模板。 已去授权,最新开源解密版。TwoNav 是一款开源的书签(导航)管理程序,使用PHP SQLite 3开发,界面简洁,安装简单&…

FFmepg--音频编码流程--pcm编码为aac

文章目录 基本概念流程apicode(核心部分) 基本概念 从本地⽂件读取PCM数据进⾏AAC格式编码,然后将编码后的AAC数据存储到本地⽂件。 PCM样本格式:未经压缩的⾳频采样数据裸流 参数: Sample Rate : 采样频率Sample Size : 量化位数Number o…

Matlab进阶绘图第45期—蝴蝶气泡图

蝴蝶气泡图是一种特殊的柱泡图/气泡柱状图。 蝴蝶图一般由左右两个水平柱状图组合而成,其形如蝴蝶展翅,可以很直观地展示两种数据直接的差异。 而蝴蝶气泡图则是在两个水平柱状图每根柱子外侧额外添加大小不同的气泡,用于表示另外一个数据变…

使用IDEA2023创建传统的JavaWeb项目并运行与调试

日期:2024-0312 作者:dusuanyun 文档环境说明: OS:Deepin 20.9(Linux) JDK: OpenJDK21 Tomcat:10.1.19 IDEA: 2023.3.4 (Ultimate Edition) 本文档默认已经安装JDK及环境变量的配置。 关键词…

单片机设计-超声波视力保护仪的设计与实现

项目介绍 技术:C语言、单片机等 本设计利用超声波技术检测眼睛与书本的距离,调整看书位置,通过光敏检测判断环境光线强度是否适合阅读,并通过定时器设定阅读时长,以此解决人们由于看书姿势的错误,阅读环境…

Android11 FallbackHome启动和关闭流程分析

Android 7.0引入了新特性:Direct Boot Mode,设备启动后进入的一个新模式,直到用户解锁(unlock)设备此阶段结束。在这个模式下,系统调用 resolveHomeActivity 找到的是FallbackHome ,而不是我们的…

Python keyword-only参数

keyword-only 参数是Python 3中引入的一种新的参数语法。它允许您在定义函数时强制要求某些参数必须以关键字参数的形式传递。这种机制有助于提高代码的可读性和可维护性。 以下是 keyword-only 参数的语法: def function_name(arg1, arg2, *, kwarg1, kwarg2value):# 函数体…

Vscode screen 模式终端窗口查看历史信息

进入查看模式 ctrl a, [ 退出 ctrl c