今日内容概要
- redis 的linux安装和配置
- redis 的api使用
- 高级用法之慢查询
- pipline事务
内容详细
1、redis 的linux安装和配置
-最新:7.0
-最稳定版本:6.x
-讲课:5.x
-企业里:3.x,4.x,5.x 6.x(极少数公司在用)
-windows:3.x,5.x
-大部分公司-多多少少都会用到 redis
-99%以上公司项目会用关系型数据库(mysql,postgrasql,oracle,国产数据库:达梦)
-80%公司用redis
-去ioe--->ibm(浪潮,联想) ,oracle(达梦..),emc存储
-通用性东西:网络,数据库,redis,nginx,docker...
1 速度快:10w ops(每秒10w读写),数据存在内存中,c语言实现
2 持久化:rdb和aof
3 多种数据结构:
五大数据结构
BitMaps位图:布隆过滤器 本质是 字符串
HyperLogLog:超小内存唯一值计数,12kb HyperLogLog 本质是 字符串
GEO:地理信息定位 本质是有序集合--》附近5公里的美女
4 支持多种编程语言:基于tcp通信协议,各大编程语言都支持,客户端
5 功能丰富:发布订阅(消息) Lua脚本 事务(pipeline),实现分布式锁---(mysql,redis,zookeeper)
6 简单:源代码几万行,不依赖外部库(源码编译安装---》可执行文件执行)
7 主从复制:主服务器和从服务器,主服务器可以同步到从服务器中
8 高可用和分布式:
2.8版本以后使用redis-sentinel支持高可用
3.0版本以后支持分布式
1.1 下载安装
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar -xzf redis-5.0.7.tar.gz
ln -s redis-5.0.7 redis
cd redis
-Makefile
-src
-redis.conf
make
make install
redis-server--->redis服务器
redis-cli---》redis命令行客户端
redis-benchmark---》redis性能测试工具
redis-check-aof--->aof文件修复工具
redis-check-dump---》rdb文件检查工具
redis-sentinel---》sentinel服务器,哨兵
redis作者对windows维护不好,window自己有安装包
ps aux|grep redis
kill 进程id
cd /root/s20(安装路径)
rm -f /usr/local/redis/bin/redis*
rm -f /usr/local/bin/redis*
rm -rf redis
1.2 三种启动方式
默认的 /usr/bin /usr/local/bin
./src/redis-server
ps -ef|grep redis
netstat -antpl|grep redis
redis-cli -h ip -p port ping
redis-cli -h 127.0.0.1 -p 6379
redis-serve --port 6380
vim redis.conf
daemonize yes
pidfile /var/run/redis.pid
port 6379
dir "/root/s20/redis/data"
logfile 6379.log
mkdir data
redis-server ./redis.conf
1.3 客户端连接
redis-cli -p 端口 -h 地址
redis-cli -h 127.0.0.1 -p 6370 -a 123456
config get port
config get *
config set maxmemory 128M
config set requirepass 123456
config REWRITE
redis-cli -p 端口 -h 地址
auth 123456
redis-cli -h 127.0.0.1 -p 6370 -a 123456

1.4 使用场景
做缓存,接口缓存
网站访问量,转发量,评论数(文章转发,商品销量,不会出现并发问题)
发布订阅,阻塞队列实现(简单的分布式,blpop:阻塞队列,生产者消费者)
有序集合(阅读排行,点赞排行,推荐(销量高的,推荐)) 有序集合
很多特效跟社交网络匹配,粉丝数,关注数 集合
垃圾邮件处理系统,布隆过滤器
2、redis 的api使用
2.1 通用命令
-空间复杂度(占多大内存),时间复杂(耗费多长时间)
-O(1),O(log n),O(n),O(n方)
打印出所有key
keys *
打印出所有以he开头的key
keys he*
打印出所有以he开头,第三个字母是h到l的范围
keys he[h-l]
三位长度,以he开头,?表示任意一位
keys he?
keys命令一般不在生产环境中使用,生产环境key很多,时间复杂度为 o(n),用scan命令
dbsize
设置a
set a b
查看a是否存在
exists a
(integer) 1
存在返回1 不存在返回0
删除成功返回1,key不存在返回0
expire name 3
ttl name
persist name
type name
info 命令:内存,cpu,主从相关--->django写一个redis服务监控--》折线图,饼形图
subprocess---》redis-cli -a 123456 info---》字符串---》
client list 正在连接的会话
client kill ip:端口
client kill 127.0.0.1:40704
dbsize
flushall
flushdb
select 数字
monitor
注意:
1 纯内存
2 非阻塞IO (epoll),自身实现了事件处理,不在网络io上浪费过多时间
1 一次只运行一条命令
2 拒绝长慢命令
-keys,flushall,flushdb,慢的lua脚本,mutil/exec,operate,big value
3 其实不是单线程(在做持久化是另外的线程)
2.2 字符串操作
get name
set name lqz
del name
incr age
decr age
incrby age 10
decrby age 10
统计网站访问量(单线程无竞争,天然适合做计数器)
缓存mysql的信息(json格式)
set name lqz
setnx name lqz
set name lqz nx
set name lqz xx
mget key1 key2 key3
mset key1 value1 key2 value2 key3 value3
n次get和mget的区别:
n次get时间=n次命令时间+n次网络时间
mget时间=1次网络时间+n次命令时间
getset name lqznb
append name 666
strlen name
increbyfloat age 3.5
getrange key start end
setrange key index value
2.3 哈希hash 类型
info {name:lqz,age:19,hobby:字符串}
hget key field
hset key field value
hdel key field
hset user:1:info age 23
hget user:1:info ag
hset user:1:info name lqz
hgetall user:1:info
hdel user:1:info age
hexists key field
hlen key
hexists user:1:info name
hlen user:1:info
hmget key field1 field2 ...fieldN
hmset key field1 value1 field2 value2
hgetall key
hvals key
hkeys key
hincrby user:1:info pageview count
建议用字符串,json形式存
hsetnx key field value
hincrby key field intCounter
hincrbyfloat key field floatCounter
2.4 列表
rpush 从右侧插入
rpush key value1 value2 ...valueN
lpush 从左侧插入
linsert key before|after value newValue
linsert listkey before b java
linsert listkey after b php
lpop key
rpop key
lrem key count value
1 count>0 从左到右,删除最多count个value相等的项
2 count<0 从右向左,删除最多 Math.abs(count)个value相等的项
3 count=0 删除所有value相等的项
lrem listkey 0 a
lrem listkey -1 c
ltrim key start end
ltrim listkey 1 4
lrange key start end
lrange listkey 0 2
lrange listkey 1 -1
lindex key index
lindex listkey 0
lindex listkey -1
llen key
lset key index newValue
lset listkey 2 ppp
blpop key timeout
brpop key timeout
lpush+lpop
lpush+rpop
lpush+ltrim
lpush+brpop
2.5 集合
sadd key element
srem key element
scard key
sismember key element
srandmember key count
spop key
smembers key
sdiff user:1:follow user:2:follow
sinter user:1:follow user:2:follow
sunion user:1:follow user:2:follow
sdiff|sinter|suion + store destkey...
2.6 有序集合
zadd key score element
zadd class lyf 100
...
zrem key element
zscore key element
zincrby key increScore element
zcard key
zrank key element
zrange key 0 -1
zrange player:rank 0 -1 withscores
zrangebyscore key minScore maxScore
zrangebyscore user:1:ranking 90 210 withscores
zcount key minScore maxScore
zremrangebyrank key start end
zremrangebyrank user:1:rangking 1 2
zremrangebyscore key minScore maxScore
zremrangebyscore user:1:ranking 90 210
zrevrank
zrevrange
zrevrangebyscore
zinterstore
zunionstore
客户端
https://www.cnblogs.com/liuqingzheng/p/16024070.html
3、高级用法之慢查询
慢查询是一个先进先出的队列
固定长度
保存在内存中
slowlog-max-len=128
slowly-log-slower-than=10000
config set slowlog-log-slower-than 0
config set slowlog-max-len 100
config rewrite
slowlog get [n]
slowlog len
slowlog reset
4、pipline事务
如果你的pipeline的指令集很庞大,为了不干扰链接中的其他操作,你可以为 pipeline操作新建 Client链接,让 pipeline和其他正常操作分离在2个client中。
不过pipeline 事实上所能容忍的操作个数,和s ocket-output缓冲区大小/返回结果的数据尺寸都有很大的关系
同时也意味着每个 redis-server同时所能支撑的 pipeline链接的个数,也是有限的,这将受限于server的物理内存或网络接口的缓冲能力
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
pipe = r.pipeline(transaction=True)
pipe.multi()
pipe.set('name', 'lqz')
pipe.set('role', 'nb')
pipe.execute()
pipeline每次只能作用在一个Redis的节点上 集群环境中,用不了pipline
multi
set name lqz
set age 18
exec
wathc age
multi
decr age
exec
multi
decr age
exec
https://www.cnblogs.com/liuqingzheng/p/9997092.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!