redis 第一天
目录
redis 第一天一 .linux命令补充1.vim命令补充2 .linux命令补充二.在虚拟机中安装redis1.redis是什么2.Redis安装1、上传并解压2、安装编译所需的依赖3、编译并安装Redis4、配置环境变量5、复制配置文件6、修改配置文件7、编辑service文件8、启动、停止、重启Redis服务三. redis中String类型学习1.redis中的数据类型2.redis中String类型的命令四.redis 中的bitmap位图1.bitmap基本命令2.bitmap 位操作3.bitmap 库的操作及认识
一 .linux命令补充
1.vim命令补充
yy | 复制单行,通过在前面加上数字来复制当前光标所在行下的多行 |
---|---|
P | 将指定缓冲区的内容放到当前光标的位置之上 |
dd | 删除整行,通过在前面加上数字来删除当前光标所在行下的多行 |
x | 删除光标位置指定的字符 |
撤销上一步操作 | |
ctrl+r | 还原上步操作 |
$ | 将光标移动到行首 |
^ | 将光标移动到行尾 |
G | 将光标移动到文章末尾 |
gg | 将光标移动到文章头部 |
%x/y/g | 全局替换 x代表旧字符,y代表新字符 |
/+字符 | 查找字符 |
2 .linux命令补充
ctrl+u 删除光标之前的所有内容
cd - 返回到跳转之前的上一个目录
二.在虚拟机中安装redis
1.redis是什么
开源的(BSD协议),使用ANSI C 编写,基于内存的且支持持久化,高性能的Key-Value的NoSQL数据库 支持数据结构类型丰富,有如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 丰富的支持主流语言的客户端,C、C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、JavaScript 用途:缓存、数据库(微博)、消息中间件(微博)
2.Redis安装
1、上传并解压
redis 安装包可以在官网下载 redis.io
这里我们选择的是2022年1月的最新版本 redis-6.2.6
tar -zxvf redis-6.2.6.tar.gz -C /usr/local/soft/
2、安装编译所需的依赖
由于redis底层使用c语言编写的,所以我们在编译redis 安装包的时候需要
下载编译c语言的 gcc
yum install -y gcc-c++ gcc tcl
3、编译并安装Redis
# 创建一个目录 用于保存编译后的结果 mkdir -p /usr/local/soft/redis cd /usr/local/soft/redis-6.2.6 make PREFIX=/usr/local/soft/redis install
4、配置环境变量
配置环境变量便于全局使用
# 编辑文件 vim /etc/profile # 加入以下内容 JAVA_HOME=/usr/local/soft/jdk1.8.0_171 REDIS_HOME=/usr/local/soft/redis export PATH=$JAVA_HOME/bin:$REDIS_HOME/bin:$PATH # 重新加载环境变量 source /etc/profile
5、复制配置文件
cp /usr/local/soft/redis-6.2.6/redis.conf /usr/local/soft/redis/
6、修改配置文件
-
编辑文件
vim /usr/local/soft/redis/redis.conf
-
修改以下内容
# 将daemonize的值改为yes 让redis以后台方式启动 daemonize yes # 开放远程登录 # 将bind ip 设置为 bind 0.0.0.0 -::1 bind 0.0.0.0 -::1 # 将 protected-mode yes 注释掉,关闭保护模式 # protected-mode yes # 设置Redis日志文件地址 logfile "/usr/local/soft/redis/redis.log"
7、编辑service文件
之后可通过systemctl管理redis进程
-
编辑配置文件
# 切换目录 cd /usr/lib/systemd/system # 新建并编辑文件 vim redis.service
-
加入以下配置
[Unit] Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target [Service] Type=forking PIDFile=/var/run/redis_6379.pid ExecStart=/usr/local/soft/redis/bin/redis-server /usr/local/soft/redis/redis.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
8、启动、停止、重启Redis服务
-
启动
systemctl start redis
-
停止
systemctl stop redis
-
重启
systemctl restart redis
-
开机自启(可选)
systemctl enable redis
三. redis中String类型学习
1.redis中的数据类型
redis 中的数据类型除了字符串之外,全都是数据结构
其中列表相当于java中的list 集合相当于set集合,散列相当于hash,有序集合相当于hashset
Redis key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值
Key取值原则 键值不需要太长,消耗内存,且在数据中查找这类键值的计算成本较高 键值不宜过短,可读性较差
字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据 例如: 一张JPEG格式的图片或者一个序列化的Ruby对象
一个字符串类型的值最多能存储512M字节的内容
登录客户端后,获取帮助
Help
Help <tab>
Help set
Help @string
redis中的结构虽然有很多 ,但是归根结底还是一种数据库,所以学习命令的重点仍然是增删查改
2.redis中String类型的命令
设置字符串值
String类型中的存储形式都是k-v格式的
并且所书写的命令大小写不敏感,而key和value的值大小写敏感
SET key value [EX seconds] [PX milliseconds] [NX|XX]
nx = if not exist
xx = if exist
EX 设置过期时间,秒,等同于SETEX key seconds value PX 设置过期时间,毫秒,等同于PSETEX key milliseconds value NX 键不存在,才能设置,等同于SETNX key value XX 键存在时,才能设置
在使用setnx 时不可在后面写上时间,而在使用setxx时必须写上时间
设置多个键的字符串值 MSET key value [key value ...] 键不存在时,设置字符串值 MSETNX key value [key value ...] 注意:这是原子操作
过期 Redis中可以给Key设置一个生存时间(秒或毫秒),当达到这个时长后,这些键值将会被自动删除 设置多少秒或者毫秒后过期 EXPIRE key seconds
这里指定的是秒数
PEXPIRE key milliseconds
这里指定是毫秒数
设置在指定Unix时间戳过期 EXPIREAT key timestamp PEXPIREAT key milliseconds-timestamp
删除过期 PERSIST key
一般指定时间过期的key都会在时间结束后就在redis中消失,那么这里的删除过期是什么意思呢
这里的删除过期是指在指定key在指定时间内过期后,在时间没到的情况下输入命令,就会使原本在指定时间消失的key永久存在,从而消除过期定时
生存时间 Time To Live,Key的剩余生存时间
查看剩余生存时间 TTL key
查看还有多少秒
PTTL key
查看还有多少毫秒
key存在但没有设置TTL,返回-1 key存在,但还在生存期内,返回剩余的秒或者毫秒 key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)
查找键 KEYS pattern
pattern取值
-
任意长度字符 ? 任意一个字符 [] 字符集合,表示可以是集合中的任意一个
键类型 TYPE key
键是否存在 EXISTS key
如果key存在,则返回1,如果不存在,则返回0
键重命名 RENAME key newkey
RENAMENX key newkey
如果不存在 ,就创建新的
键删除 DEL key [key ...]
获取值 GET key 获取多个给定的键的值 MGET key [key ...]
返回旧值并设置新值 GETSET key value
如果键不存在,就创建并赋值
字符串长度 STRLEN key
追加字符串 APPEND key value 如果键存在就追加;如果不存在就等同于SET key value
获取子字符串 GETRANGE key start end 索引值从0开始,负数表示从字符串右边向左数起,-1表示最有一个字符
start和end都是索引,并且左闭右闭
覆盖字符串 SETRANGE key offset value
offset 指的是开始位置的索引,value指的是索要替换的值,如果此时value的长度超过了原本
字符串的长度,则会往后延伸
步长1的增减 INCR key DECR key
这里用于增加补偿的value 必须是integer类型的值,否则就会报错,并且增加步长之后仍然会转换成String类型的值
步长增减 INCRBY key decrement DECR key decrement
可以指定value增加的步长
四.redis 中的bitmap位图
位图不是真正的数据类型,它是定义在字符串类型中
一个字符串类型的值最多能存储512M字节的内容
位上限:2^(9+10+10+3)=2^32b
1.bitmap基本命令
设置某一位上的值 SETBIT key offset value offset偏移量,从0开始 value不写,默认是0
由于位图中的数据存储是通过二进制的字节存储的,所以offset表示的是从0开始的索引,value的值表示的是该位上置0还是置1,
而在取值时表现出来的则是存储的二进制值转换成的十六进制,当此时的值对应ascii码表中的某个值时,则会表现为相对应的符号
获取某一位上的值 GETBIT key offset
返回指定值0或者1在指定区间上第一次出现的位置 BITPOS key bit [start] [end]
2.bitmap 位操作
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 dteskey 上 operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种 BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
并操纵:有0得0
BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey
或操作: 有1得1
BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
异或操作:相同得1,不同得0
BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey
非操作:全部取反
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0 空的 key 也被看作是包含 0 的字符串序列 思考:a位或b是什么?
统计指定位区间上值为1的个数 BITCOUNT key [start] [end] 从左向右从0开始,注意官方start、end是位,测试后是字节 BITCOUNT testkey 0 0表示从索引为0个字节到索引为0个字节,就是第一个字节的统计 BITCOUNT testkey 0 -1等同于BITCOUNT testkey 最常用的就是 BITCOUNT testkey
如下图中 a的十六进制对应的ascii码值为61 写成二进制就是 11000001
而 b 的十六进制对应的ascii码值为62 写成二进制就是11000010
因为start end 表示的是字节的索引 ,所以 bitcount k2 0 1 表示的就是第一个字节和第二个字节中的位数中1的次数 ,即 3 + 3 =6
注意 : xshell中我们设置了默认编码为utf-8,所以我们在redis中写入中文可以识别,但是在删除中文时,由于中文在utf-8编码中一个占三个字节,而在redis中按一次删除键只会删除一个字节,也就是说,按三次删除键才会删除掉一个中文字符
3.bitmap 库的操作及认识
在redis中并没有表的概念,但是有库的概念。在redis中系统默认有16个库
登录不同的库 redis-cli --help redis-cli -n 2
在登陆的情况下切换数据库
select index
清除当前库数据 FLUSHDB
清除所有库中的数据 FLUSHALL