一站式学习Redis, 从入门到高可用分布式实践-01redis初识、02api的理解和使用
01-redis初识
-
redis8大特性
速度快、持久化、多种数据结构、支持多种编程语言、功能丰富、简单、主从复制、高可用/分布式 -
计算机组成原理
从上到下依次是:寄存器、一级缓存、二级缓存、内存、本地硬盘、远程硬盘
速度是越来越慢的 -
redis多种数据结构
string、hash、list、set、zset
bitmaps: 位图
hyperloglog: 超小内存唯一值计数
geo: 地理信息定位 -
redis典型应用场景
-
缓存系统
-
计数器
-
消息队列系统
-
排行榜
-
社交网略
-
实时系统
-
redis启动方式
最简启动、动态参数启动、配置文件启动 -
安装redis
- weget https://download.redis.io/redis-stable.tar.gz
- tar -xzvf redis-stable.tar.gz
- ln -s redis-stable redis
- cd redis
- make
- 新建配置文件
将配置文件中#开头的和空行都过滤掉然后重定向到redis-6382.conf这个配置文件中
cat redis-6381.conf | grep -v "#" | grep -v "^$" > redis-6382.conf
- redis的最最基础配置
daemonize yes
port 6382
dir "/opt/soft/redis/data"
logfile "redis-6382.log"
requirepass 123456 # 密码
- 后台启动redis
redis-server config/redis-6382.conf
02-API理解和使用
-
通用命令
keys、dbsize、exists、del、ttl、expire、type -
keys命令
-
keys * 怎么用?
热备从节点、scan -
dbsize时间复杂度是O(1), exists时间复杂度是O(1),
-
key过期相关的命令expire,ttl, persist
- persist命令可以取消key的过期时间,一直不过期
命令 | 时间复杂度 |
---|---|
keys * | O(n) |
dbsize | O(1) |
type key | O(1) |
exists key | O(1) |
expire key EX/PX | O(1) |
ttl key | O(1) |
persist key | O(1) |
del key | O(1) |
-
数据结构和内部编码
-
单线程
单线程为什么这么快
(1)纯内存
(2)非阻塞IO,使用了epoll,采用了Io多路复用技术
(3)避免线程切换和竟态消耗 -
flushall和flushdb
flushall删除所有的数据库
flushdb删除现有的数据库 -
字符串
-
字符串的使用场景:缓存、计数器、分布式锁等等
字符串命令:set、get、incr、decr、incrby、decrby
incr key:key +1
decr key: key -1
incrby key number: key + number
decrby key number: key - number -
计数器:记录网站每个用户个人主页的访问量
incr userid:pageview (单线程,无竞争)
-
缓存:缓存视频的基本信息(数据源在mysql中),伪代码
-
分布式锁id
-
字符串另外的一些命令
set key value: 不管key是否存在,都设置
setex key seconds value: 设置key/value,同时设置过期时间,单位秒
setnx key value:如果key不存在就设置成功,如果key已经存在那么设置失败,返回0
set gender true xx:key存在才会更新,不存在不能更新 -
mget、mset
mget性能要比多次get好的多,如下图
-
查漏补缺
getset、append、strlen
getset是一个原子的操作,为这个key设置新的值,同时返回老的值: GETSET name wangwu
append可以给字符串末尾追加字符:append hello " abc"
strlen可以统计字符的长度 -
incrbyfloat、getrange、setrange
incrbyfloat f1 3.5: 浮点数增加
getrange key start end:按索引截取字符串
setrange key offset value: 按索引修改字符串 -
字符串总结:
字符串常用16个命令:set get mset mget incr decr incrby decrby incrbyfloat setnx setxx setex getset strlen getrange setrange append
- hash
- hget hset hdel
- hexists hlen
- hmget hmset
- hash实战
- hincrby key field increment
- 当做缓存
- hash其余命令
- hgetall hkeys hvals
字符串和hash命令对比
- hash命令查漏补缺
- hsetnx hincrby hincrbyfloat
-
hash时间复杂度总结
-
list
- rpush lpush lpop rpop
- lindex key index
- lrange key start end
- lrem key count value
- linsert l1 BEFORE|AFTER pivot value
-
lrem命令
lrem key count value
count分为三种情况:
(1)count>0: 从左边删除count个value
(2)count<0: 从右边删除Math.abs(count)个value
(3)count=0: 删除所有的value -
ltrim命令,按照索引范围修剪列表
ltrim key start stop
将一个列表裁剪成左闭右闭的列表 -
lset命令,更新指定索引的值
lset key index value -
list查漏补缺
- blpop/brpop key [key ...] timeout
lpop的阻塞版本,timeout是超时时间,timeout为0表示一直阻塞知道收到消息弹出
-
TIPS
lpush + lpop = stack
lpush + rpop = queue
lpush + brpop = message queue -
set集合
- sadd srem
- SINTER key [key ...] 可以获取两集合中的交集
- SDIFF key [key ...] 可以获取第一个key有的而第二个key没有的
- SUNION key [key ...] 获取两个集合中所有的元素(相同的自动就去重了)
- 集合的特点: 无序、不重复、集合间操作sinter sdiff sunion
- smembers key: 获取集合中的所有元素
- sismember key member:查看一个元素是否是集合中的元素
- scard key: 获取集合中一共有多少个元素
- srandmember key [count]:从集合中随机获取count个元素
- spop key [count]: 从集合中随机弹出count个元素
- zset有序集合
-
集合VS有序结合
-
列表VS有序结合
-
重要API(注意:score可以重复,element不可以重复)
添加:zadd key score element
删除:zrem key member [member ...]
按照分值范围进行删除:zremrangebyscore key min max
按照片名范围进行删除:zremrangebyrank key start stop
查看:zrange key start end
根据成员获取分值:ZSCORE key member
给成员增加指定的分值:zincrby key increment member
获取集合中元素的个数:zcard key
按照分值范围获取元素个数:zcount key min max
获取成员在有序集合中的索引排名:zrank key member(按照升序的排名)
获取成员在有序集合中的索引排名:zrevrank key member (按照降序的排名)
获取有序结合中从start开始到end结束的集合元素和score分值:zrange key start stop [WITHSCORES] -
查漏补缺
有序集合中按照降序获取元素:zrevrange key start stop [WITHSCORES]
按照成绩从小到大获取:zrangebyscore key min max [withscores]
按照成绩范围从大到小获取zrevrangebyscore key max min [WITHSCORES]
大于等于两个有序集合的交集放到新的集合中,并且score+在一起:zinterstore destination numkeys key [key..]
将多个集合并集到新的集合中,并且score+在一起:zunionstore destination numkeys key [key ..] -
有序集合命令总结