数据类型(重点)
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命令(了解)
特点:有序、不重复
- 有序集合用于存储键值对;
- 有序集合的键被称为成员member,每一个成员都是独一无二的;
- 有序集合的值被称为分值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何时进行照快照:
- 服务器正常关闭时,会照一次快照 ./bin/redis-cli shutdown
- 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