Redis(二)之数据类型、常用命令以及持久化

数据类型(重点)

这里写图片描述
Key的取值:自定义,key名不要过长,否则影响使用效率;Key不要太短,最好是有意义。


Redis命令

String命令(重点)

字符串类型是Redis中最为基础、常用的数据存储类型,字符串在Redis中是二进制安全的,这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的Value最多可以容纳的数据长度是512MB。

二进制安全和数据安全是没有关系的。
MySQL-关系型数据库,二进制不安全。【乱码丢失数据】
这里写图片描述
这里写图片描述

常用命令

命令 功能
set key value 设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”
如果赋予相同的key,新的value会覆盖老的value
get key 获取key的value。如果与该key关联的value不是String类型,redis将返回错误信息,
因为get命令只能用于获取String value;如果该key不存在,返回(nil)。
del key 删除指定key
返回值是数字类型,表示删了几条数据
getset key value 先获取该key的值,然后再设置该key的值。
incr key 将指定的key的value原子性的递增1。如果该key不存在,其初始值为0,在incr之后其值为1。
如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息。相当于 ++i
decr key 将指定的key的value原子性的递减1。如果该key不存在,其初始值为0,在incr之后其值为-1。
如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息。相当于 - -i
append key value 拼凑字符串。如果该key存在,则在原有的value后追加该值;
如果该key不存在,则重新创建一个key/value

String使用场景:主要用于保存json格式的字符串


Hash命令(了解)

Redis中的Hash类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。

Hash<------>{username:"张三",age:"18",sex:"man"}<------>javaBean

Hash特点:占用的磁盘空间极少

命令 功能
hset key field value 为指定的key设定field/value对(键值对)。
hmset key field value [field2 value2 …] 设置key中的多个filed/value
hmget key filed1 filed2 … 获取key中的多个filed的值
hgetall key 获取key中的所有filed-vaule
del key 删除整个hash
hkeys key 获得所有的字段
hvals key 获得所有的value
keys * 查询所有的key

list命令(重点)

特点:有序、可重复(双向链表)

命令 功能
lpush key values[value1 value2…] 在指定的key所关联的list的头部插入所有的values,
如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,
之后再向该链表的头部插入数据。插入成功,返回元素的个数。
rpush key values[value1、value2…] 在该list的尾部添加元素。
lrange key start end 获取链表中从start到end的元素的值,start、end从0开始计数;
也可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…
lrange key 0 -1:查询该list的所有元素
lpop key 返回并弹出指定的key关联的链表中的第一个元素,即头部元素。
如果该key不存在,返回nil;若key存在,则返回链表的头部元素。
rpop key 从尾部弹出元素。
llen key 返回指定的key关联的链表中的元素的数量。
rpoplpush resource destination 将链表中的尾部元素弹出并添加到头部。[循环操作]

使用场景:

  • 微博 TimeLine
  • 消息队列

set命令(重点)

特点:无序、不重复

命令 功能
sadd key values[value1、value2…] 向set中添加数据,如果该key的值已有则不会重复添加
smembers key 获取set中所有的成员
sismember key member 判断参数中指定的成员是否在该set中,
1表示存在,0表示不存在或者该key本身就不存在。
srem key members[member1、member2…] 删除set中指定的成员
sdiff key1 key2… 返回key1与key2中相差的成员,而且与key的顺序有关。即返回差集。
(属于A并且不属于B的元素构成的集合)
sinter key1 key2 key3… 返回交集。(属于A且属于B的元素构成的集合)
sunion key1 key2 key3… 返回并集。(属于A或者属于B的元素构成的集合)
scard key 获取set中成员的数量
srandmember key 随机返回set中的一个成员

使用场景:大数据集合的并集,交集,差集运算。

  • 共同好友、二度好友
  • 利用唯一性,可以统计访问网站的所有独立 IP
  • 好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐

zset命令(了解)

特点:有序、不重复

  1. 有序集合用于存储键值对;
  2. 有序集合的键被称为成员member,每一个成员都是独一无二的;
  3. 有序集合的值被称为分值score,分值必须是浮点数。
命令 功能
zadd key score member score2 member2 … 将所有成员以及该成员的分数存放到sorted-set中。
如果该元素已经存在则会用新的分数替换原有的分数。
返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
zscore key member 返回指定成员的分数
zrange key start end [withscores] 获取集合中脚标为start-end的成员,[withscores]返回的成员包含其分数。
(分数由小到大排列)
zrevrange key start end [withscores] 获取集合中脚标为start-end的成员,[withscores]返回的成员包含其分数。
(分数由大到小排列)
zrem key member[member…] 移除集合中指定的成员,可以指定多个成员。

使用场景:排行榜


Redis通用命令(重点)

keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys。
通配符:

  • *表示任意0个或多个任意字符
  • ?表示任意一个字符
命令 功能
keys * 查询所有的key
keys ???? 查询4个字符的key
del key1 key2… 删除指定的key
exists key 判断该key是否存在,1代表存在,0代表不存在
type key 获取指定key的值类型。该命令将以字符串的格式返回。
返回的字符串为string、list、set、hash和zset,如果key不存在返回none。

设置key有效/过期

命令 功能
expire key 设置key的生存时间,单位:秒。如果某个key过期,redis会将其删除
ttl key 获取该key所剩的超时时间,如果没有设置超时,返回-1。如果返回-2表示超时不存在。

例如:用户激活。
激活邮件,激活短信。30分钟内


扩展知识(了解)

消息订阅与发布

订阅新闻,新闻发布

命令 功能
subscribe channel 订阅频道,例:subscribe mychat,订阅mychat这个频道
psubscribe channel* 批量订阅频道,例:psubscribe s*,订阅以”s”开头的频道
publish channel content 在指定的频道中发布消息,如 publish mychat “today is a newday”

例如:登录QQ时,电脑右下角有时会发来小窗口,这是Redis发送过来一段html代码,然后解析而成的窗口

多数据库

MySQL数据库可以自己用语句自定义创建
create database xxxx;

Redis也是有数据库的。 Redis已经提前创建好了。
Redis默认有16个数据库。0,1,2…….15

在Redis上所做的所有数据操作,都是默认在0号数据库上操作
数据库和数据库之间,不能共享键值对。

命令 功能
select 数据库名; 切换数据库
move key 1 将当前库的key移植到1号库中
flushdb 清空当前数据库
flushall 清空Redis服务器数据

Redis事务

MySQL事务:目的为了保证数据完整性,安全。

Redis事务:目的为了进行redis语句的批量化执行。

命令 功能
multi 开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,
直到执行EXEC时,这些命令才会被原子的执行,类似与关系型数据库中的:begin transaction
exec 提交事务(执行批量化),类似与关系型数据库中的:commit
discard 事务回滚(不执行批量化操作),类似与关系型数据库中的:rollback

服务器命令

  • ping:测试连接是否存活,返回PONG则代表存活
  • quit:退出客户端
  • dbsize:返回当前数据库中key 的数目
  • info:查看redis数据

Redis持久化

内存(兔子):高效、断电数据就会消失
硬盘(乌龟):读写速度慢于内存的,断电数据依旧存在

持久化:把数据保存在硬盘上

关系型数据库MySQL持久化:

  • 任何增删改语句,都是在硬盘上做的操作。
  • 断电以后,硬盘上的数据还是存在。

非关系型数据库Redis:

  • 默认情况下,所有的增删改,数据都是在内存中进行操作。
  • 断电以后,内存中的数据不存在的。

断电以后,redis的部分数据会丢失,丢失的数据是保存在内存中的数据。

Redis存在持久化操作。

Redis有两种持久化策略:

RDB:是redis的默认持久化机制。

RDB相当于照快照。保存的是一种状态。

20G数据 —> 几kb快照

    优点:1、快照保存数据速度极快,还原数据速度极快
         2、适用于灾难备份

    缺点:1、小内存机器不适合使用。
         RDB机制符合要求就会照快照。(随时随地启动),会占用一部分系统资源(突然的),很可能因为内存不足直接宕机。(宕机后,服务器会关闭,非正常关闭,导致丢失数据)
              服务器正常关闭时 照快照
              Key满足一定条件,照快照

    适用于:内存比较充裕的计算机。

RDB何时进行照快照:

  1. 服务器正常关闭时,会照一次快照 ./bin/redis-cli shutdown
  2. key满足一定条件,会照一次快照

redis.config

save 900 1 #每900秒(15分钟)至少有1个key发生变化,则dump内存快照。
save 300 10 #每300秒(5分钟)至少有10个key发生变化,则dump内存快照
save 60 10000 #每60秒(1分钟)至少有10000个key发生变化,则dump内存快照
    key发生变化(key数据添加、修改、删除)
    例如1:12:00 – 12:15  ,有1个key发生变化,在12:15就照一次快照保存
        12:00 – 12:15  ,没有任何key发生变化,在12:15不会照快照

    例如2:12:00 – 12:05  ,有11个key发生变化,12:05就照一次快照保存
        12:00 – 12:05  ,有9个key发生变化,12:05不会照快照,12:15 会照快照

    例如3:  12:00 – 12:01  ,有15000个key发生变化,12:01就照一次快照保存
        12:00 – 12:01  ,有1000个key发生变化,12:01不会照快照,12:05会照快照

AOF: 使用日志功能保存数据操作。

AOF保存对key的增删改操作语句。

默认时AOF机制关闭的。

    优点:1、持续性占用极少量的内存资源
    缺点:1、日志文件会特别大,不适用于灾难恢复
         2、恢复效率远远低于RDB

    适用于:内存比较小的计算机

AOF操作:
只会保存导致key变化的语句

AOF配置:

  • always #每次有数据修改发生时都会写入AOF文件。比较安全,但是极为浪费效率
  • everysec #每秒钟同步一次,该策略为AOF的缺省策略。安全性低,比较节省系统资源
  • no #从不同步。高效但是数据不会被持久化。不安全

开启AOF机制:
redis.conf

appendonly yes

策略的选择:
redis.conf

# appendfsync always
appendfsync everysec
# appendfsync no

猜你喜欢

转载自blog.csdn.net/code_shadow/article/details/80767235