这节记一下几个常用数据类型的基础操作指令和数据持久化。
一、几种数据类型
1、String类型
value类型为string,基础操作指令:
set name long : 设置一个键值对
get name : 获取该键的值
mset age 22 content 大兴机场 : 一次设置多个key value
mget age name content : 一次获得多个key的value
strlen content : 获得对应key存储value的长度
append content |在北京 : 为对应key的value追加内容
getrange content 13 23 : 截取value的内容
setex class 30 5 : 设置一个key存活的有效期(秒)
psetex grade 30000 66 : 设置一个key存活的有效期(毫秒)
setnx age 88(返回值为0,因为已存在age key) | setnx class 88 :存在不做任何操作,不存在添加
msetnx age 88 grade 7(返回值为0,因为已存在age key) | msetnx grade 7 address beijing : 可以同时设置多个key,只要有一个存在都不保存
decr age : 进行数值类型的-1操作
decrby age 5 : 自定义自减数值
incr age : 进行数值类型的+1操作
incrby age 10 : 自定义自增数值
incrbyfloat age 1.555555555555555555555555555 : 浮点数自增(保留17位)
2、List类型
list 列表 相当于java中list 集合
特点:元素有序 且 可以重复
lpush list jin yun long : 将某个值加入到一个key列表头部,这里要注意我先将jin加入到表头,然后是yun代替jin成为表头,最后是long,所以最后列表的输出顺序为long yun jin
lpushx jjj lll(返回值为0,因为找不到jjj这个list) | lpushx list fine : 同lpush,但是必须要保证这个key存在
rpush list come from beijing : 将某个值加入到一个key列表末尾,先将come放在表尾,然后是from,最后是beijing
rpushx kkk ppp(返回值为0,因为找不到kkk这个list) | rpushx list daxing : 同rpush,但是必须要保证这个key存在
llen list : 获取列表元素个数
lrange list 0 7 : 获取某一个下标区间内的元素
lpop list : 返回和移除列表左边的第一个元素
rpop list : 返回和移除列表右边的第一个元素
lset list 5 heilongjiang : 设置(修改)某一个指定索引的值(索引必须存在)
lindex list 5 : 获取某一个指定索引位置的元素
lrem list 5 jin : 删除重复元素(5 为要删除的个数,返回值为实际删除数量)
ltrim list 0 5 : 保留列表中特定区间内的元素
linsert list before heilongjiang haerbin : 在某一个元素之前,之后插入新元素
3、Set类型
特点: Set类型 Set集合 元素无序 不可以重复
sadd set jin yun long come from beijing daxing : 为集合添加元素
smembers set : 显示集合中所有元素 无序
scard set : 返回集合中元素的个数
spop set : 随机返回一个元素 并将元素在集合中删除
smove set set1 beijing : 从一个集合中向另一个集合移动元素 必须是同一种类型
srem set daxing : 从集合中删除一个元素
sismember set 999(找不到这个元素则返回0) | sismember set jin : 判断一个集合中是否含有这个元素
srandmember set : 随机返回元素
sinter set set1 : 求交集
sunion set set1 : 求并集
sdiff set set1 : 去掉第一个集合中其它集合含有的相同元素(注意这里只是返回了一个比对结果,对实际的第一个集合值没有影响)
4、ZSet类型
特点: 可排序的set集合 可排序 不可重复
实际场景:可用于积分排行榜
zadd zset 10 jin 15 yun 20 long 30 come 50 from 85 beijing 100 daxing : 添加一个有序集合元素(根据分数下标自己排序)
zcard zset : 返回集合的元素个数
zrange zset 0 -1 (withscores) : 返回一个范围内的元素(带着分) 升序
zrevrange zset 0 -1 (withscores) : 返回一个范围内的元素(带着分) 降序
zrangebyscore zset 0 60 : 按照分数查找一个范围内的元素
zrank zset jin : 返回该元素对应索引
zrevrank zset jin : 返回该元素对应索引 (倒序)
zscore zset daxing : 显示某一个元素的分数
zrem zset daxing : 移除某一个元素
zincrby zset 15 beijing : 给某个特定元素加分
5、Hash类型
特点: value 是一个map结构 存在key value 无序
hset hash 1 jin : 设置一个key/value对
hget hash 1 : 获得一个key对应的value
hdel hash 1 : 删除某一个key/value对
hexists hash 1 : 判断一个key是否存在
hmset hash 1 jin 2 yun 3 long 4 come 5 from 6 beijing 7 daxing : 设置多个key/value
hmget hash 1 3 5 7 : 获得多个key的value
hgetall hash : 获得所有的key/value对
hvals hash : 获得所有的value
hkeys hash : 获得所有的key
hincrby hash 8 2 : 为value进行加法运算
hincrbyfloat hash 8 1.555555555555555555555555555555555555 : 为value加入浮点值
hsetnx hash 8 kk(如果map中已存在该key则返回0,图里没截到) : 设置一个不存在的key的值
二、用可视化工具查看
这里是在windows本机上装了RedisDeskManager去连,但是一直连不上centos上的redis服务。
第一步按视频里老师说的(也不是)把bind 127.0.0.1给注释了,并且 把protected-mode yes 改为 protected-mode no ;发现还是不行,然后发现是服务器没有开7000(我这里是把配置文件启动端口也改了并且放在其他相对路径启动了)端口,开一下发现可以连接成功了,可以看到刚才写入到库1的内容了。
几个指令:
./redis-server ../redis.conf : 指定启动时加载的配置文件为上一级配置文件
注释配置文件中的 bind 127.0.0.1 ; 把protected-mode yes 改为 protected-mode no
./redis-cli -p 7000 : 服务器本地自测连接
firewall-cmd --query-port=7000/tcp : 查看7000端口火墙策略
firewall-cmd --add-port=7000/tcp : 增加策略
三、持久化机制
持久化提供了两种不同的持久化方法,一种是快照(记录值),另一种是AOF(只追加到日志文件,记录操作指令)。
1、快照(Snapshot)
这种方式可以将某一时刻的所有数据都写入硬盘中,当然这也是redis的默认开启持久化方式,保存的文件是以.rdb形式结尾的文件因此这种方式也称之为RDB方式。
有四种实现快照的方式:
1.客户端方式之BGSAVE
客户端可以使用BGSAVE命令来创建一个快照,当接收到客户端的BGSAVE命令时,redis会调用fork来创建一个子进程,然后子进程负责将快照写入磁盘中,而父进程则继续处理命令请求。
名词解释: fork当一个进程创建子进程的时候,底层的操作系统会创建该进程的一个副本,在类unix系统中创建子进程的操作会进行优化:在刚开始的时候,父子进程共享相同内存,直到父进程或子进程对内存进行了写之后,对被写入的内存的共享才会结束服务
2.客户端方式之SAVE
客户端还可以使用SAVE命令来创建一个快照,接收到SAVE命令的redis服务器在快照创建完毕之前将不再响应任何其他的命令
注意! SAVE命令并不常用,使用SAVE命令在快照创建完毕之前,redis处于阻塞状态,无法对外服务
3.服务器配置方式之满足配置自动触发
如果用户在redis.conf中设置了save配置选项,redis会在save选项条件满足之后自动触发一次BGSAVE命令,如果设置多个save配置选项,当任意一个save配置选项条件满足,redis也会触发一次BGSAVE命令
4.服务器接收客户端shutdown指令
当redis通过shutdown指令接收到关闭服务器的请求时,会执行一个save命令,阻塞所有的客户端,不再执行客户端执行发送的任何命令,并且在save命令执行完毕之后关闭服务器
1.2方式均需要手动执行命令实现,假如说不操作的话我们应该是用方法3.4比较多。4不说了,停止redies服务时会生成一个快照。主要用的是方法3,但是方法3假如说在服务器宕掉后,部分数据存储在内存里,还没达到配置文件中设置的save值时,这部分数据则不会被存储在快照里,在服务器宕机后对应数据也会被内存释放,丢失。
2、AOF 只追加日志文件
这种方式可以将所有客户端执行的写命令记录到日志文件中,AOF持久化会将被执行的写命令写到AOF的文件末尾,以此来记录数据发生的变化,因此只要redis从头到尾执行一次AOF文件所包含的所有写命令,就可以恢复AOF文件的记录的数据集。
如上图,开启AOF的方式以及日志追加频率的选择,一般默认应该就是everysec,因为用always非常吃硬盘性能;no的话要看操作系统。
所以用everysec就完事了。每秒记一次的话,服务器如果宕了,最多丢失一秒内产生的数据。
综上持久化机制对应的两种方法,在服务器宕机后都会丢失数据。想不丢失数据请考虑关系型数据库。
ex、AOF的重写
目的是在一定程度上减小AOF文件的体积。因为持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。所以为了压缩aof的持久化文件Redis提供了AOF重写(ReWriter)机制。
触发重写的方式,和快照类似,也分手动和自动
重写原理在这里就不做探究了。
持久化的总结:将数据持久化到磁盘是必须的,而且建议备份在多个不同地方。两种持久化的方式可以一块用也可以都不用或者用一种;需要看具体的业务场景。