Redis基础学习

1.redis注意点

  • redis是单进程的
  • 默认有16个数据库,编号为0-15
  • 进入相应数据库:
select num
  • 查看数据库的key数量:
dbsize 或者 keys*
  • 删除当前库&删除所有库:
flushdb & flushall

2.redis数据类型

五大数据类型: String Hash List Set Zset

2.1.key操作

  • 判断key存在操作:不存在,返回0;存在,返回1

exists key

  • 移动key到其他库

move key db

  • 为给定的key设置过期时间

expire key 秒数

  • 查看还有多少秒过期,-1为永不过期,-2为已过期

ttl key

  • 查看key的数据类型

type key

  • 删除key

del key


2.2.String类型

  • 设置/获取/删除/添加/查看长度

set/get/del/append/strlen key (value)

  • 值为数字进行加减incr/incrby/decr/decrby

incr/decr key:每次加减1
incrby/decrby key num:每次加减num

  • 获取一个value指定区间范围的值,(between....and),其中从零到负一代表全部

getrange key num(start) num(end)

  • setrange key num XXX 设置key所对value值从第num位开始变为XXX

setrange key num XXX

  • 设置某一个有效时间的key(setex:set with expire)

setex key 有效时间 value

  • 如果不存在该key则设置为该value(setnx:set if not exist)

setnx key value

  • 同时设置/获取N个key-value

mset/msetnx key1 value1 key2 value2 ...
mget key1 key2 key3 ...


2.3.List列表操作

  • 正序插入(最后插入的放栈底)/倒序插入(最后插入的放栈顶)/获取list范围的值(其中从0到-1代表全部)

rpush/lpush list(key) value1 value2 ...
lrange list(key) num(start) num(end)

  • 弹出栈顶/栈底的值

lpop/rpop list(key)

  • 按照索引下标获取元素,index范围:[0-(length-1)]

lindex list(key) index

  • lren key 删除N个相同的value

lren list(key) num value

  • 截取指定范围值再赋值给该key,index范围:[0-(length-1)]

ltrim key index(start) index(end)

  • 将源列表栈底元素插入到目的列表的栈顶

rpoplpush list1(源) list2(目的)

  • 替换list中某下标的值,index范围:[0-(length-1)]

lset key index value

  • 将某值(value1)插入到list中某值(value)的前/后

linsert list(key) brfore value value1
linsert list(key) after value value1


2.4.Set集合操作

  • 设置/获取/该value是否为该集合的值(返回结果 0:不是,1:是)

sadd key value1 value2 ...
smembers key
sismember key value

  • 获取集合中元素个数

scard key

  • 删除集合中的元素

srem key value

  • 随机获取集合中num个元素

srandmember key num

  • 随机出栈

spop key

  • 将set1集合中的元素value移动到set2

smove set1 set2 value

  • 数学结合类操作
  • 差集:获取在第一个集合(set1)中,不在第二个集合(set2)中的元素

sdiff set1 set2

  • 交集:同时在第一个集合(set1)和第二个集合(set2)中

sinter set1 set2

  • 并集:第一个集合(set1)和第二个集合(set2)中所有的元素(去重)

sunion set1 set2


2.5.Hash哈希操作(KV模式不变,但V是一个键值对)

  • 设置/获取/设置多个/获取多个/删除V hash1元素

hset hash1 id idval
hget hash1 id
hmget hash1 id idval name nameval age ageval
hmget hash1 id name age
hgetall hash1
hdel hash1 id(或name ...)

  • 获取hash1元素个数

hlen hash1

  • 判读hash1中某个key是否存在(0:不存在 1:存在)

hexists hash1 key

  • 获取hash1的所有的key/value

hkeys hash1
hvals hash1

  • 为hash1中的key的value增加num(整数/小数)

增加整数:hincrby hash1 key num(int)
增加小数:hincrbyfloat hash1 key num(float)

  • hash1中不存在该key时才会创建(0:失败,1:成功)

hsetnx hash1 key value


2.6.Zset有序集合操作

在set基础上。加了一个score值
之前set是k1 v1 v2 v3 ...
现在zset是k1 score1 v1 score2 v2 ...

  • 设置添加

zadd zset1 score1 v1 score2 v2

  • 根据value下标值获取值得范围:(num:value下标值;withscores:带score值输出)

zrange zset1 0 -1
zrange zset1 0 -1 withscores
zrange zset1 num(start) num(end)

  • 获取score的范围

zrevrangebyscore zset1 start end
 score范围:start <= value <= end
zrevrangebyscore zset1(start (end
 范围:start < value < end
zrevrangebyscore zset1 start end limit 2 3
 从结果中第二个开始截取3个返回

  • 删除zset1某个元素(该元素的score一块删除)

zrem zset1 v1

  • 获取zset1的元素数量

zcard zset1

  • 根据score的范围获取value对应的下标值

zcount zset1 score1 score2

  • 根据value值获取下标

zrank zset v1

  • 根据zset1 的value值获取对应的score值

zscore zset1 v1

  • 逆序(倒序)获取value下标值:将值倒序排列,获取其下标值

zrevrank zset1 v3

  • 根据范围正序/逆序获取value值

zrange zset1 0 -1
zrevrange zset1 0 -1

  • 逆序根据score获取value

zrevrangebyscore zset1 score2 score1


3.redis配置文件

  • Units单位

1.配置文件单位,开头定义一些基本的度量单位,只支持bytes,不支持bit
2.不区分大小写

  • includes部分

include包含:redis.conf作为一个总闸,包含其他redis配置文件

  • general部分
  • snapshotting快照

1.save:可以直接手动备份
2.stop-writes-on-bgsave-error:当后台保存出错时,前台停止再写入。
3.rdbccompression:对磁盘中的快照,是否进行压缩存储,若yes,则使用LZF算法进行压缩
4.rdbchecksum:存储快照后,使用CRC64算法检验数据
5.dbfilename:默认保存的文件名
6.dir:保存路径

  • security部分

设置密码/操作有密码权限的redis
config set requirepass password
auth password

  • redis启动路径

config get dir

  • limits限制
  1. maxClients 10000:默认可连接的最大客户端数量
  2. maxmemory:最大的内存
  3. maxmemory-policy:最大内存策略
    可选值:
    volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放
    allkeys-lru:从数据集中(包括设置和未设置过期时间的),选择最近醉酒未使用的数据释放
    volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放
    allkeys-random:从数据集中(包括设置和未设置过期时间的),随机选择一个数据进行释放
    volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放
    noeviction:不删除任何数据(redis还会根据引用计算器进行释放),若内存不够时,直接返回错误
    LRU算法:
    最近最久未使用算法,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对象,释放这些对象占用的空间,LRU算法就提供了一种策略,选择最近一段时间内,最久未使用的对象将其淘汰。
  4. maxmemory-samples:设置样本的数量,进行测试。redis会默认检查这么多个key并选择其中的LRU的那个。
  • APPEND ONLY MODE

1.appendonly:默认为no,yes开启aof的持久化
2.appendfilename:默认保存的文件名
3.appendfsync:储存方式(策略)
  always:数据持久化,每次发生数据变更会被立即记录到磁盘,性能较差但数据完整性比较好。
  everysec:默认设置,异步操作,每秒记录,如果一秒内宕机,有数据丢失
  no:不记录
4.no-appendfsync-on-rewrite:重写时是允许appendfsync,默认no,保证数据安全性
5.auto-aof-rewrite-percentage:当前aof文件比上次重写的增长比例大小,默认一倍
6.auto-aof-rewrite-min-size:最开始aof文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了(根据上一次重写完成之后的大小).此变量仅初始化启动redis有效.如果是redis恢复时,则lastSize等于初始aof文件大小.

  • 参考:
      Redis配置文件详解
      Redis内存回收:LRU算法

4.redis持久化(Redis Persistence)

  • rdb(Redis DataBase)

1.在指定时间间隔内,将内存中的数据集写入本地磁盘
2.redis单独创建(fork)一个子进程进行持久化,会先写入到一个临时文件,待持久化结束后,再替换原来的源持久化文件。
3.恢复Snapshot快照,将数据集从磁盘读回内存
4.rdb保存的是dump.rdb文件
5.当redis执行关闭shutdown或flushall时,会迅速截断,生成dump.rdb文件,但是由于内存已经清空,所以保存的dump.rdb为空文件。
6.可以使用save命令自动备份。
7.如何恢复:将备份文件移动到redis安装目录并启动服务即可,config get dir 获取目录

  • aof(Append Only File)

1.以日志的形式记录每个写操作,将redis执行过的所有写指令记录下来,只许追加文件但不可以改写文件,redis启动之初会读取文件重构数据。即根据日志文件的内容将写指令全部执行一遍以完成数据恢复工作。
2.aof保存的是appendonly.aof
3.异常恢复:redis-check-aof --fix进行修复,之后重启
4.rewrite:aof会采取文件追加,文件会越来越大,避免出现如此,新增重写机制,当aof文件大小超过设计阈值,redis会启用aof文件内容压缩,只保留可恢复数据的最小值指令集,可以使用命令bgrewriteaof
5.redis会记录上次重写时aof大小,默认配置是当aof文件是上次重写后大小的一倍且文件大于64M时触发
6.aof运行效率慢于rdb;aof村粗配置灵活

  • 总结&使用

1.rdb持久化方式是指定的时间间隔对你的数据快照存储
2.aof持久化是记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始数据,aof命令以redis协议追加保存每次系的操作到文件末尾。redis还能对aof文件进行后台重写,使aof文件不至于体积过大。
3.只做缓存使用:若仅当数据在服务器运行的时候存在,可以不使用任何持久化方式。


5.redis事务

  • 事务

一次执行多个命令,一个事务中所有的命令都会序列化,按顺序串行的执行而不被其他命令插入。

  • 作用

一个队列中,一次性、顺序性、排他性的执行一系列命令。

  • 使用

1.diacard:取消事务,放弃执行事务块内的所有命令。
2.exec:执行所有事务块内的命令。
3.multi:标志一个事务的开始。
4.unwatch:取消watch命令对所有key的监视。
5.watch:监视一个(或多个)key,若执行事务前,key值被其他命令所改动,事务被打断
  乐观锁:锁每条记录,为每条记录添加版本号,当只有修改数据冲突时,才需要重新去服务器拿被修改最新版本数据重新修改。
  悲观锁:在数据被使用的时候,不允许其他人再使用。直至锁解除。
  CAS:比较和替换,基于乐观锁锁的操作
watch指令,在事务提交时,若key值已经被改变,整个事务队列不会被执行。
通过watch命令在事务执行之前监控多个keys,若在watch之后有任何key发生变化,exec命令执行事务都会被放弃,同时返回nullmuliti-bulk应答事务执行失败。

  • 事务创立过程

1.监控:以watch keys 监控事务上锁,keys为即将执行的操作的数据
2.开启:以milti开始一个事务
3.入队:将多个命令入队事务中,接到命令后不会立即执行,而是放入等待执行的事务队列中。
4.执行:由exec命令触发事务

  • 特性:

不保证原子性,支持部分事务。

6.redis消息订阅

  • 是什么

进程间的一种通信模式:发送者(pub)发送消息,订阅者(sub)接受消息.

7.redis的复制机制(master/stave)

  • 是什么

即是主从复制,主机更新后根据配置和策略,自动同步到备份的master/slaver机制,master以写为主,slave以读为主。

  • 作用

主从复制,容灾恢复

  • 怎么做

1.配置从库不配置主库
2.从库配置:slaveof 主库IP 主库端口
3.每次与master断开之后,都需要重新连接,除非配置redis.conf
4.修改配置文件
 拷贝多个配置文件redis.conf
 info replication:查看配置
 slaveof no one:当前数据库停止与其他数据库的同步,转成主数据库

  • 用法

一主二仆:
1.主机可写,从机不可写,只读(读写分离)。
2.主机挂掉,从机待命
3.主机恢复,从机照旧
4.从机挂掉,需要重连主机
薪火相传:
主机接从机,从机后继续连接从机
反客为主:
主机挂掉,使用命令slaveof no one,变从机为主机(从机后接有从机)

  • 复制原理

1.slave启动成功连接到master后,会发送一个sync命令。
2.master接到命令后启动后台的存盘进程,同时手机所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以便完成一次完全同步。
3.全量复制:当slave服务在接受到数据库文件数据后,将其存盘并加载到内存中。
4.增量复制:master继续将新的所有手机到的修改命令依次传给slave,完成同步。
5.但只要重新连接master,一次完全同步(全量复制)将自动执行。

  • 哨兵模式(反客为主的自动版)
  • 是什么

在后台监控主机是否故障,如果故障了根据投票数自动将从库转换成主库。

  • 操作步骤:

1.调整结构为一主二仆
2.自定义的/myredis目录下新建文件:sentinel.conf,名字不能错
3.配置哨兵,在sentinel.conf文件中添加:
 ①:sentinel moniter 被监控主机名(自定义) 主机IP 端口号 1
 ②:数字1表示当主机挂掉后,salve投票,看谁的票数多,谁接替主机。
4.启动哨兵:redis-sentinel /usr/local/myredis/sentinel.conf(全路径地址)
5.当主机A挂掉,从机中选出从机B为主机B,当原主机A再次启动后,哨兵将其加为主机B的从机。

6.一组sentinel能同时监控多个master

  • 复制缺点

1.复制延迟:由于所有的写操作都在master上,然后同步到slave,所以从master同步到slave机器有一定延迟,当系统很繁忙的时候,延迟更严重。

你可能感兴趣的:(Redis基础学习)