redis 基础

257 阅读6分钟

一、安装

  1. gcc环境
# 查看gcc环境
gcc -v
# 没有需要安装
yum -y install gcc-c++
  1. redis 安装
# 解压缩
tar -zxvf redis-7.4.0.tar.gz
# 进入redis
cd redis-7.4.0
# make
make && make install
# 安装路径
cd /usr/local/bin/
# 查看
ls

image.png

  1. 复制默认配置文件
cd /opt/
mkdir redis
cp /home/soft/redis-7.4.0/redis.conf redis/
  1. 修改配置文件
vim redis/redis.conf
## 修改以下内容
daemonize yes
protected-mode no
# 注释掉
# bind 127.0.0.1 -::1
requirepass xxx(你的密码)
  1. 启动
redis-server /opt/redis/redis.conf
# 出现警告
# WARNING Memory overcommit must be enabled! Without it, a background 
# save or replication may fail under low memory condition.Being disabled,
# it can also cause failures without low memory condition, see 
# https://github.com/jemalloc/jemalloc/issues/1328. 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.
# 安装上面的描述 修改/etc/sysctl.conf
vim  /etc/sysctl.conf
# 增加一行 允许内核分配所有物理内存
vm.overcommit_memory = 1
# 保存后 使配置生效
sysctl -p
# kill 掉刚才的redis 再次启动没有警告
ps -ef|grep redis
kill pid(redis进程)
# 再次启动
redis-server /opt/redis/redis.conf
  1. 测试连接
redis-cli -a xxx(刚才的密码) -p 6379
# 连接成功后 ping 返回PONG 
ping
# 退出客户端
quit
  1. 关闭服务端
redis-cli -a xxx(密码)  shutdown

二、常用命令

set k1 v1
set k2 v2
set k3 v3
# 查看所有key
keys *
# key是否存在
exists k1
# key的类型
type k2
# 删除key数据
del k1
# 非阻塞删除
unlink k2
# 查看key过期时间 -1 永不过期 -2 已过期
ttl k3
# 设置过期时间 单位s
expire k3 5
# 将key移动到指定数据库 
move k1 3
# 切换到指定数据库
select 3
# 当前库的key数量
dbsize
# 清空当前库
flushdb
# 清空所有库
flushall
# 帮助命令
help
help @string(命令/数据类型)

三、数据类型

1.string

key、value 为string类型

# ==== SET 命令 =====
# set key vakye [可选参数]
# 可行参数
# EX seconds:以秒为单位的过期时间
# PX milliseconds: 微妙为单位的过期时间
# EXAT timestamp: 秒为单位的unix时间戳所对应的时间为过期时间
# PXAT milliseconds-timestamp:微妙为单位的unix时间戳所对应的时间为过期时间
# NX:键不存在时设置值
# XX:键存在时设置值
# KEEPTTL:保留设置前key的生存时间
# GET:返回原来的值,不存在则返回nil

# === 多个值设置获取 ===
mset k1 v1 k2 v2
mget k1 k2
# k1 k4 都不存在才成功
msetnx k1 v11 k4 v4

# === 获取/设置value的某个范围值 ===
GETRANGE k1 0 -1
SETRANGE k1 1 xy

# === 数值增减 ===
set k1 100
INCR k1
# 制定步长
incrby k1 3
# 减少
decr k1
decrby k1 4

# === 长度及字符串追加 ===
STRLEN k1
APPEND k1 ff

# === setnx  setex ===
# 10s后过期
SETEX k1 10 v1
# 不存在才设置
setnx k1 v11

#=== 先获取在set ===
GETSET k1 abc

2.List

单key 多个value 可从两端push或者pop元素

# === 添加元素 ===
lpush list1 1 2 3 4 5
RPUSH list1 11 22 33 44 55
# === 获取元素 ===
lrange list1 0 -1
# === 弹出元素 ===
lpop list1
rpop list1
# === 获取指定下标元素 ===
LINDEX list1 2
# === 元素个数 ===
llen lsit1
# === 删除元素 制定个数 ===
lrem list1 2 a
# === 只要list部分数据 ===
ltrim list1 2 4 
# === 将list的数据push到另一个list ===
rpoplpush list1 list2
# === 设置指定下标值 ===
lset list1 1 hello
# ===在某个值前面或者后面插入指定值===
linsert list1 before c world
linsert list1 after c yy

3.hash

value是一个键值对

# === 获取/设置值 ====
hset user:001 id 11 name haha age 23
hget user:001 name
hmset user:002 name lisi age 24
hmget user:002 name age
hgetall user:001
hdel user:002 name

# === 获取key对应里面的kv数量 ===
hlen user:001

# === 是否存在某个key ===
hexists user:001 name

# === 所有key、value ===
hkeys user:001
hvals user:003

# === 指定字段增加值 ===
hincrby user:001 age 3
hincrbyfloat user:001 age 0.7

# === 不存在才设置值 ===
hsetnx user:001 name wangwu

4.set

集合,元素不重复

# === 添加 获取 ===
sadd set1 1 1 1 2 2 2 3 4 4 5 5
smembers set1

# === 是否存在某个值 ===
sismember set1 x

# === 删除某个值 ===
srem set1 1

# === 共多少元素 ===
scard set1

# === 随机获取一个或多个元素 ===
srandmember set1
srandmember set1 3

# === 随机获取并删除元素 ===
spop set1
spop set1 2

# === 移动指定元素到另一个set ===
sadd set2 a b c
smove set1 set2 2

# === 集合运算  ===
sadd set1 a b c 1 2
sadd set2 1 2 3 a x
# 差集合 在set1中不在set2中
sdiff set1 set2
# 并集 在set1和set2中
sunion set1 set2
# 交集 在set1且在set2中
sinter set1 set2
# 不返回结果集 返回交集个数
sintercard 2 set1 set2

5.zset

sorted set 可按照score排序

# === 添加 获取 ===
zadd zset1 60 v1 70 v2 80 v3 90 v4 100 v5
zrange zset1 0 -1
# 带score 从小到大
zrange zset1 0 -1 withscores
# 从大到小
zrevrange zset1 0 -1  withscores
# 指定score范围的数据 加( 不包含
zrangebyscore zset1 60 90 withscores
zrangebyscore zset1 (60 90 withscores

# === 获取指定元素的分数 ===
zscore zset1 v4

# === 获取元素数量 ===
zcard zset1

# === 删除制定元素 ===
zrem zset1 v5

# === 增加制定元素的分数 ===
zincrby zset1 4 v4

# === 指定分数范围的元素个数 ===
zcount zset1 70 90

# === 从键名列表中的第一个非空排序集中弹出一个或多个(最小或最大)元素 ===
zmpop 1 zset1 min count 1
zrange zset1 0 -1 withscores

# === 获取下标志(可倒序)===
 zrank zset1 v2
 zrevrank zset1 v2

6.bitmap

位图,0和1组成的bit数组

# === 设置 获取 ===
setbit k1 1 1
setbit k1 2 1
getbit k1 2

# === 统计字节数占用字节数 ===
setbit k1 8 1
strlen k1

# === 获取所有为1的数量 ===
bitcount k1

# === 位操作 ===
setbit k2 1 1
setbit k2 2 1
bitop and k3 k1 k2

7.hyperloglog

去重复统计功能的基数估计算法,只统计基数(去重复的数量),不保存元素,标注误差0.81%

# ==== 添加 统计 合并 ===
pfadd hll2 1 2 5 5 5 5 7 8 10
pfcount hll2
pfmerge hll3 hll1 hll2
pfcount hll3

8.geo

地理空间数据

# === 添加 ===
geoadd city 116.405994 39.916485 bj 121.280702 31.187381 sh 118.77867 32.162875 "南京"

# 显示中文 
redis-cli --raw

# === 获取坐标 ===
geopos city  bj sh 南京

# ===  返回坐标hash base32编码值 ===
geohash city bj sh 南京

# === 位置之间的距离 ===
geodist city bj sh km

# === 以xx为半径查找多少距离之内的元素 ===
georadius city 118.793618 32.067946 100 km withdist withcoord withhash count 10 desc
# 指定元素附近
georadiusbymember city sh 1000 km withdist withcoord withhash count 10 asc

9.stream

redis 消息中间件

# === 添加消息 ===
xadd mystream * id 1 name zhangsan
# === 查询消息 ===
xrange mystream - + count 1
xrevrange mystream + -
# === 删除消息 ===
xdel mystream 1723014222595-0
# === 队列长度 ===
xlen mystream
# === 裁剪长度 ===
xtrim mystream maxlen 2
xtrim mystream minid 1723015996067-0
# === 读消息 $-当前最大id之后的信息===
xread count 2 streams mystream $
xread count 5 streams mystream 0
# 阻塞
xread count 1 block 0 streams mystream $

# === 创建消费组 ===
xgroup create mystream groupX $
xgroup create mystream groupA 0
# === 消费组读取消息 ===
xreadgroup group groupA consumer1 streams mystream >
xreadgroup group groupA consumer2 streams mystream >
# === 未ack的消息 ===
xpending mystream groupC
xpending mystream groupC - + 10 consumer2
# === ACK 确认消息 ===
xack mystream groupC 1723016181890-0
# === stream 信息 ===
xinfo stream mystream

10.bitfields

位域,很少使用

set fieldkey hello
# === 获取指定位值 u-无符号 i-有符号===
bitfield fieldkey get i8 0
bitfield fieldkey get i8 #0
bitfield fieldkey get i8 8
bitfield fieldkey get i8 #1
# === 设置 ===
bitfield fieldkey set i8 8 120
# === 自增 ===
bitfield fieldkey incrby u4 2 1