Redis数据库基本使用
一、什么是redis?
Redis(Remote Dictionary Server):使用C语言开发的内存高速缓存数据库。数据模型为key-value:键值对。且支持数据持久化,保证数据安全。
后端启动redis:修改redis配置文件redis.conf中daemonize no(改为yes),执行./redis-server redis.conf,后启动终端./redis-cli即可使用。
二、redis中对key的操作
key命名:除’\n’和空格外,其他字符均可组成key名称,长度不做要求。
指令 | 作用 |
---|---|
exists key | 测试指定的key是否存在 |
del key1 key2 … | 删除指定的key |
type key | 返回指定key的value类型 |
keys pattern | 返回匹配指定模式的所有key |
rename oldkey newkey | 修改key名称 |
dbsize | 返回当前数据库的key数量 |
expire key seconds | 为key设置过期时间 |
ttl key | 返回key的剩余过期秒数 |
select db-index | 选择数据库 |
move key db-index | 将key从当前库移动到指定的库 |
flushdb | 删除当前数据库中所有key |
flushall | 删除所有数据库中的所有key |
db-index:redis默认最多共有16个数据库[0-15]。
String类型操作
String类型是redis最基本的数据类型,可包含任何数据(jpg图像或序列化的对象等),单个value值得上限为1G字节。
如果只使用string类型,redis可看作加上持久化特性的mamcache。
指令 | 作用 |
---|---|
set key value | 设置key的值为value |
get key | 获取key的值 |
mset key1 value1 key2 value2… | 一次性设置多个key的值 |
mget key1 key2 … | 一次性获取多个key的值 |
incr key | 对key的值做加操作并返回新的值 |
decr key | 对key的值做减操作并返回新的值 |
incrby key integer | 同incr,加上指定值 |
decrby key integer | 同decr,减去指定值 |
append key value | 给指定的key的字符串追加value |
substr key start end | 返回截取过的key的字符串值 |
incr:该指令对key进行+1操作(默认累加1);对新key或已有key进行操作(新key:创建并加一,即:值为1;以后key:已有key的信息值类型要求必须为整型)。
decr:与incr类似,执行-1操作。
substr key start end:对内容进行截取,包括start和end标记位置内容。
list链表类型
实质为双向链表。通过push和pop进行操作从链表的头部或尾部增删元素。这使得list即可作为栈,也可作为队列。
指令 | 作用 |
---|---|
lpush key string | 在key对应的list头部添加字符串 |
rpop key | 从list的尾部删除元素,并返回删除元素 |
llen key | 返回对应list的长度,不存在返回0,非list返回错误 |
lrange key start end | 返回指定区间的内容,下标从0开始 |
rpush key string | 在尾部添加字符串 |
lpop key | 从list头部删除元素,并返回删除元素 |
ltrim key start stop | 截取list,保留指定区间内元素 |
set集合类型
string类型的无序集合。set元素最大可包含2 的 32次方 - 1 个元素。
基本操作:增、删、交、并、差(例:好友推荐功能的实现)。
每个集合中的元素不能重复。
指令 | 作用 |
---|---|
sadd key member | 增加一个string元素到对应的set集合,成功:1,已存在:0,set不存在:错误 |
srem key mem1 mem2 … | 从key对应set中移除指定元素,成功:删除的mem数量 |
smove p1 p2 member | 将member从p1对应的set中移动到p2对应的set中 |
scard key | 返回set中的元素数量 |
sismember key member | 判断member是否存在set中 |
sinter key1 key2… | 返回所有给定key的交集 |
sunion key1 key2… | 返回所有给定key的并集 |
sdiff key1 key2… | 返回所有给定key的差集 |
smembers key | 返回key对应的set的所有元素 |
sort set排序集合类型
string类型元素的集合。每个元素会关联一个权值,通过权值可以有序的获取集合中的元素。应用:获取热门类型信息。
指令 | 作用 |
---|---|
zadd key score member | 添加权值为score的成员,若存在则更新权值为score |
zrem key member | 删除指定元素,成功返回1,不存在返回0 |
zincrby key incr member | 将指定的member的score值增加incr,并返回新的score |
zrank key member | 返回member在集合中的下标,从小到大排序 |
zrevrank key member | 同zrank,从大到小排序 |
zrange key start end | 返回接货中指定区间的元素,返回有序结果 |
zrevrange key start end | 同上,按照score逆序 |
zcard key | 返回集合中元素个数 |
zscore key element | 返回指定元素的score |
zremrangebyrank key min max | 删除集合中给定区间的元素(score从小到大) |
hash
与mysql数据库中存储的一条记录极为相似。
指令 | 作用 |
---|---|
hset key field value | 设置hash field为指定值,若key不存在,则先创建 |
hget key field | 获取指定的hash field |
hmget key field1 field2… | 获取多个hash field |
hmset key field1 value1 … | 设置多个hash field |
hincrby key field integer | 将指定的hash field增加指定值 |
hexists key field | 测试指定hash field是否存在 |
hdel key field | 删除指定hash field |
hlen key | 返回指定hash的field数量 |
hkeys key | 返回hash的所有field |
hvals key | 返回hash的所有value |
hgetall key | 返回hash的所有field和value |
三、持久化功能
redis为了内部数据的安全考虑会将本身的数据以文件形式保存到硬盘中一份,在服务区重启之后自动把硬盘中的数据恢复到内存(redis)中。
数据保存到硬盘的过程称为:“持久化”效果。
(1)snap shotting快照持久化
该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(10 - 20G),则不适合频繁做该持久化操作。
对应文件dump.rdb
对应redis.conf中配置项:
save 900 1 #900秒内发生一次修改,进行持久化
save 300 10 #300秒内发生10此修改,进行持久化
save 60 10000 #60秒内发生10000此修改,进行持久化
可采用每小时进行一次快照持久化,期间进行精细持久化(可达到秒级)。
快照持久化可精细持久化可以尽最大努力保证数据的安全。
手动发起快照持久化:
reddis-cli -h ip -p port bgsave
bgsave:异步保存数据到磁盘(按快照保存)
lastsave:返回上次成功保存到磁盘的Unix时间戳
shutdown 同步保存到服务器并关闭redis服务器
bgrewriteaof:当日志文件过长时优化aof日止文件存储
(2)append only file(AOF持久化)
本质:将用户执行的每个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体指令而已。
开启aof持久化(会清空redis内部的数据):配置文件修改后需要删除旧进程,根据新的配置文件重启开启新进程。
频率:每秒
# appendfsync always //每次收到写命令立即强制写入磁盘,最慢,保证完全的持久化,不推荐使用
appendfsync everysec//每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no//完全依赖os,性能最好,持久化没保证。
为aof备份优化
./redis-cli -h -ip -p port bgrewirteaof
四、主从模式
主服务器:写入服务 从:查询、读取服务(耗时)
为降低每个redis服务器的负载,可以多设置几个,并做主从模式。
一个服务器负载“写”数据,其他服务器负载“读”数据。
主服务器会“自动“同步给从服务器。
对应配置项:
slaveof: ip port
slave-read-only yes