Web

Redis基础入门

运行位置

我自己的安装位置,放在环境变量目录里更方便

opt/redis/src/redis-server

测试连接运行

redis-cli -p 6378 ,在ping后得到pong

image 20210131215242972 3

shutdown 关闭redis

在cli下的命令

输入命令前缀可使用TAB补全,不区分大小写

命令解释
keys *显示所有key
flushall清空所有数据库的key
flushdb清空当前数据库的key
set [key] [value]设置kv对
get [key] [value]根据key获取value
del [key]移除key
exists [key]查看是否存在
select [number]选择数据库 共16个数据库
expire [key ] [number]设置key为number秒过期
ttl [key]查看key还有多少时间过期
type [key]查询key类型
persist [key]设置永不过期
rename [key] [newkey]更改key的名字
move [key] [number]移动到number数据库

命令来源

Redis官网

可以直接去官网搜素命令

image 20210131221710432 4

String

String可以用来存储字符串,整数,浮点数

使用上面命令的set和get就可以设置String类型的数据,可以不用加双引号,默认String类型,如果使用set设置的value是数字,则设置为数字类型。

int类的长度是c++中的long,为2^63-1

String字符是以 8 位二进制存储的

语法含义
STRLEN [key]获取key的长度
APPEND [key]拼接字符串
incr [key]自增
decr [key]自减
incrby [key] [num]增长key num个
decrby [key] [num]减少key num个
getrange [key] [numa] [numb]截取numa到numb的value字符(闭区间)
setrange [key] [numa] [value]value的内容,从numa开始替换value的长度
setex [key] [num] [value]设置key的value,并且过期时间为num秒
setnx [key] [value]如果不存在设置key的值,成功为1,失败为0
mset [key1] [value1] [key2] [value2] ….批量设置key value
msetnx [key1] [value1] [key2] [value2] …setnx的批量操作,注意是原子操作,仅当所有key都不存在时才能设置成功
getset [key] [value]获取key的旧值并设置新值

使用案例

  • 设置key时,可以使用如下格式user:{id}:{field} id表示用户,field表示字段
  • 统计文章浏览量,粉丝数

List

List可以作为栈,队列。相当于list名为key,有多个value。

List指令有一个特点,指令都是L开头

这里要说明一下,List分为左右

image 20210201202457128 1
指令解释
LPUSH [list] [value]左压入队列list,值为value
[L/R]PUSHX [list] [value]当列表存在时才执行,否则返回0
RPUSH [list] [value]右压入队列list,值为value
LRANGE [list] [numa] [numb]从右向左获取numa到numb范围的value,当numa=0,numb=-1时,获取全部value。
LPOP [list]左移除value,返回移除的value
RPOP [list]右移除value,返回移除的value
Lindex [list]根据下标访问list
Llen [list]返回list长度
LREM [list] [num] [value]移除num个value值
LTRIM [list] [numa] [numb]截取numa与numb之间的值
RPOPLPUSH [lista] [listb]右pop一个元素移动到listb中
LSET [list] [num] [value]list中num位置的值更改为value
LINSERT [list] [after/before] [value1] [value2]在value1前或后插入value2

Set

Set是无序的,其中的值不能重复,指令均为S开头

指令解释
sadd [set] [value]添加
sismember [set] [value]存在value返回1
smembers [set]获取set所有值
scard [set]获取set集合中的个数
srem [set] [value]移除某个value
srandmember [set]随机获取一个value
spop [set]随机移除一个元素
sdiff [key1] [key2]两个key中不一样的元素
sinter [key1] [key2]两个key的交集
sunion [key1] [key2]两个key的并集

Set可以用于实现不同好友的共同关注显示,粉丝列表的实现。

Hash

Hash用于保存对象,一个对象可以设置多个值

代码解释
hset [hash] [key] [value]设置字段
hget [hash] [key]根据字段获取值
hgetall [hash]获取hash的所有字段值
hdel [hash] [key]删除字段
hlen [hash]查询hash
hexists [hash] [key]查看hash中的字段是否存在
hkeys [hash]获取hash所有字段
hvals [hash]获取hash中所有值
in/de cr [hash] [key]自增自减

Zset

在set的基础上添加顺序,一些基础用法与set相同,小的值在上面。

代码解释
zadd [key] [num] [value]根据num排序value
zrangebyscore [key] [-inf] [+inf] (withscores)从小到大通过范围获取value,inf表示无穷,还可以通过withscores返回num
zrevrange [key] [0] [-1]从大到小获取value

Zset可以用于加权数据,或者实现排行榜

Hyperloglog

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

代码解释
pfadd [key] [value1] …输入元素
pfcount [key]统计key的个数
pfmerge [key1] [key2]合并key1 key2

基数可以用来统计浏览量,不能查看value,且有小量误差1%以内

Bitmaps

位存储,两个状态都可以使用Bitmaps

代码解释
setbit [key] [位数] [值]定义值
getbit [key] [位数] [值]取值
bitcount [key]返回值为1的个数

事务

事务:一组命令的集合,在执行的过程中会按照顺序执行

一次性 顺序性 排他性

Redis单条命令保存原子性,但是事务不保证原子性

执行过程

  • 开启事务(multi)
  • 命令入队
  • 执行事务 (exec)

取消事务指令:discard

监视

watch [key] 加乐观锁,在执行事务之前执行,防止执行事务中变量被更改

unwatch [key] 解锁

watch相当于记录下当前的值,如果修改失败unwatch后再次监控就好

悲观锁

认为什么时候都会出现问题,无论做什么都会加锁

乐观锁

认为什么时候都不会出问题,不会上锁。更新数据的时候去判断一下,在此期间是否有人修改过这个数据

Redis.conf

启动的时候,通过配置文件启动

配置文件unit单位对大小写不敏感

网络

bind ip 通过哪个ip可以访问到redis

通用

daemonize yes # 以守护进程方式运行

databases 16 #默认16个数据库

RDB配置

 save 900 1                  
 save 300 10
 save 60 10000

在规定时间内修改多少次会保存

stop-writes-on-bgsave-error yes

持久化失败后仍然运行

rdbcompression yes

压缩RDB文件,需要消耗cpu资源

rdbchecksum yes

保存RDB文件时校验文件

dbfilename dump.rdb

RDB 文件保存名称,不能写成目录 这个文件默认在 /root下

安全

执行指令设置密码

config set requirepass password

获取密码

config get requirepass password

登录

auth password

限制

maxclients 10000 默认最大客户端数目10000

maxmemory 默认最大内存信息

maxmemory-policy noeviction 内存达到上限后的策略

  • volatile-lru:采用最近使用最少的淘汰策略,Redis将回收那些超时的(仅仅是超时的)键值对,也就是它只淘汰那些超时的键值对。
  • allkeys-lru:采用最近最少使用的淘汰策略,Redis将对所有(不仅仅是超时的)的键值对采用最近最少使用的淘汰策略。
  • volatile-lfu:采用最近最不常用的淘汰策略,所谓最近最不常用,也就是一定时期内被访问次数最少的。Redis将回收超时的键值对。
  • allkeys-lfu:采用最近最不常用的淘汰策略,Redis将对所有的键值对采用最近最不常用的淘汰策略。
  • volatile-random:采用随机淘汰策略删除超时的键值对。
  • allkeys-random:采用随机淘汰策略删除所有的键值对,这个策略不常用。
  • volatile-ttl:采用删除存活时间最短的键值对策略。
  • noeviction:不淘汰任何键值对,当内存满时,如果进行读操作,例如get命令,它将正常工作,而做写操作,它将返回错误,也就是说,当Redis采用这个策略内存达到最大的时候,它就只能读不能写了。

AOF配置

appendonly no 默认不开启AOF,使用RDB持久化

 appendfsync always     //每个操作都同步,消耗性能
 ​
 appendfsync everysec   //每秒同步
 ​
 appendfsync no         //不同步

在开启AOF后,Redis优先加载AOF文件

redis-check-aof –fix 修复aof文件,可能把错误的指令删除

  • 优点
    1. 每一次求改都同步,文件完整性会更好
  • 缺点
    1. 修复速度很慢
    2. aof运行效率也比rdb慢

学习资源

推荐狂神的视频!!!https://www.bilibili.com/video/BV1S54y1R7SB?p=36

发表评论