1.redis的数据结构
redis存储的是key-value格式的数据,其中key都是字符串类型,value主要有5种不同的数据结构,如下所示:
- 字符串类型:string
- 哈希类型:hash
- 列表类型:list
- 集合类型:set
- 有序集合类型:sortedset
2.redis中的数据库
redis默认有16个数据库(0号到15号),初始默认使用的是0号数据库。
- 数据库的切换
# select index
select 8表示使用8号数据库
- 清空当前库
flushdb
- 清空全部数据库
flushall
3.对key的一些操作
1. 提示
#如果对某个命令的使用生疏,则help 命令名
127.0.0.1:6379> help set
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
2.删除key
del 'key_name'
# 或者
del key_name
3.序列化给定的key,返回被序列化的值
dump 'key_name'
4.判断给定的key是否存在
exists 'key_name'
5.给一个key设定过期时间
expire key seconds
expire 'key_name' 1
6.key的查询
keys '*'
7.将当前数据库的key移动到数据库db中
move 'key_name' db
8.返回给定key剩余的过期时间,毫秒为单位(-1表示永远不过期,-2表示已经过期)
pttl 'key_name'
9.返回给定key的剩余生存时间 ,秒为单位
# -1表示永不过期,-2表示已经过期
TTL 'key_name'
10.从数据库随机返回一个key
randomkey
11.修改key的名称
#只有当newkey这个键不存在时,才能修改
renamenx key newkey
#而rename命令,即使在newkey已经存在,也会用newkey替换key,不安全
12.查看key的类型
type key
13.移除 key 的过期时间,持久化key(永不过期)
persist key
14.获取当前数据库的键总数
dbsize
4.string类型的值的操作
1.string的特点
- 一个key对应一个value。
- 底层都是字节数组存储,只不过编码方式不同。 根据字符串的格式不同,可以分为三类:
- string:普通字符串,可以做拼接操作
- int:整数类型,可以做自增自减操作
- float:浮点类型,可以做自增自减操作
2.string的常用操作
- 设定key的值,key的值允许被覆盖
#set key value [EX seconds] [PX milliseconds] [NX|XX]
#nx:如果key不存在则建立,可以直接使用setnx命令
#xx:如果key存在则修改其值。
#EX:键的超时秒数,可以直接使用setex命令
#PX:键的超时毫秒数
set key mydata
- 获取key的值
get key
- 获取key所对应的值中索引0到2的字符串
getrange key 0 2
- 获取旧值,设置新值。如果先前不存在给定的键,则设置。
getset key newdata
- 可以获取多个键的值
mget key1 key2
- 设定key的值并且设定过期时间
setex key seconds values
- 只有在key不存在时才设定key的值
setnx key value
- 返回key存储的value的长度
strlen key
- 同时设定多个键值对
mset key value key value
- 给key存储的数值(值为整型)加一/减一
incr key/decr key
- 给key存储的数值(值为整型)减去给定的值
#decrby key decrement
decrby key 2
- 在原有的key值(值为字符串)上添加字符串
append key value
5.Hash类型的值的操作
1.hash类型的特点
- Redis hash 是一个键值对集合,键用field表示,值用value表示。
- hash特别适合用于存储对象。
- 类似于Java中的HashMap结构
2.hash类型的操作
- 设定key:
#hmset key field value [field value...]
#a:10, b: wujq
hmset key_name a 10 b wujq
- 删除key中字段a的值
# hdel key field
hdel key_name a
- 获取key中的所有字段和其对应的值
hgetall key
- 获取key中某个字段的值
# hget key field
hget key a
- key值中字段a是否存在
hexists key a
- 删除key的值
del key
- 获取key所有的字段
hkeys key
- 获取key所有的字段的value
hvals key
- 设置key中a的值
#设置指定键的hash字段和对应的值
hset key a 13
#设置指定键的多个hash字段和对应的值
hmset key field value [field value...]
#当field不存在才设置指定键的hash字段和对应的值
hsetnx key field value
- a自增1
# hincrby key field increment
hincrby key a 1
6.list操作
1.list特点:
- 有序:元素的插入顺序和遍历顺序可一样
- 元素可以重复
- 插入和删除快,查询慢
2.list操作:
- 遍历所有的值
lrange key start stop
#遍历列表中的所有值,则通常这样写
lrange key_name 0 -1
- 移除出列表(第一个/最后一个)并获取这个值:
// B:block的缩写
BLPOP key timeout (没有元素会阻塞直到timeout)
BRPOP key timeout (没有元素会阻塞直到timeout)
- 移除出第一个元素并返回
LPOP key
- 移除出最后一个元素并返回
RPOP key
- 获取列表长度
LLEN key
- 移除列表多个相同value的纪录(从头开始)
LREM key count value
- 保留一定范围内的数据其它的都删除:数据修剪
LTRIM key start_index stop_index
- 弹出列表a最后一个元素,添加到另一个b列表中去,并返回这个值
RPOPLPUSH source destination
- 通过索引获取列表中的值
LINDEX key index
- 通过索引设置列表key下标为index的值
LSET key index value
- 向已存的列表追加值
#往list的左边或者右边中追加一个或者多个值
#lpush key value [value...]
#rpush key value [value...]
#只有当列表存在时才追加value
rpushx key value
lpushx key value
- 往列表中的某个元素前面或者后面插入一个元素
#linsert key before|after value newvalue
7.set集合操作
1.set集合的特点
- 集合是无序集合,存入和取出的顺序不能保证一致
- 成员是唯一的,不允许元素重复。
- 支持交集、并集、差集等功能。
- 类似于Java中的HashSet
2.set的常用操作
- 添加集合
sadd key member[member...]
- 获取集合中的所有元素
smembers key
- 返回两个集合的差集
# key1中有,key2中没有
sdiff key1 [key2]
- 返回两个集合的交集
sinter key1 [key2]
- 判断集合是否包含a
sismember key a
- 移除集合中一个随机元素并返回
spop key
- 返回集合中count个随机数
srandmember key count
- 移除指定的多个成员
srem key mem1 mem2
- 两个集合并集
sunion key1 key2
- 两个集合并集存储到新的集合中
sunionstore destination key1 key2
- 获取集合大小
scard yu
- 迭代一个集合:根据匹配规则遍历集合
sscan key cursor [MATCH pattern] [COUNT count]
eg: sscan key 0 match h*
- 把集合中一个值从一个集合移动到另一个集合
smove source destination value
8.有序集合SortedSet操作
1. SortedSet的特点
- Redis中的zset和set一样也是string类型元素的集合,不允许重复元素
- 集合中的元素有顺序
- 有序的实现: 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
- 底层实现跳表加哈希表
2.SortedSet的常用操作
- 将一个或者多个member元素及其score值加入到有序集key当中
zadd key score1 value1 score2 value2
- 返回有序集key中下标在[start,end]之间的元素
zrange key start end [withscores]
- 返回有序集中所有score值在[min,max]之间的成员。有序集成员按照score值从小到大排列。
zrangebyscore key min max [withscores]
- 返回有序集中所有score值在[min,max]之间的成员。有序集成员按照score值从大到小排列。
zrevrangebyscore key max min [withscores]
- 删除有序集合中指定值的元素
zrem key value
- 为有序集key中的指定元素加上增量
zincrby key increment member
- 统计有序集合中指定分数区间内的元素个数
# 分数区间[min,max]
zcount key min max
- 返回指定值在有序集合中的排名,排名从0开始
zrank key value
9.Bitmaps
redis提供Bitmaps数据类型,可以实现对位的操作。该数据结构的示例:可以将是否访问过网站的独立用户存放在Bitmaps中,用偏移量作为用户的id,将访问过的用户记作1,没有访问过的用户记作0。
- 设置Bitmaps中某个偏移量的值,值只有两个,0或者1
# offset表示偏移量,从0开始。value值为0或者1
setbit key offset value
- 获取Bitmaps中某个偏移量的值
getbit key offset
- 统计字符串中被设置为1的bit个数。可用于统计访问过网站的用户数量。
# start和end代表起始和结束字节数
bitcount key [start end]
- bitop:bitop是一个复合操作,它可以将多个 Bitmaps 的 and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 操作并将结果保存在 destkey 中。
10.redis配置文件
redis.conf 配置项说明:参考
11.redis的持久化
- 概念:redis是一个内存数据库,当redis服务器重启后,或者电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中
- redis的持久化机制
1. RDB:默认方式,不需要配置,默认使用这种方式
在指定的间隔时间中,检测key的变化情况,然后持久化数据。
2. AOF:日志记录的方式,可以记录每一条写命令的操作,每一次写命令操作后持久化数据。
1.RDB持久化方式(redis database)
- 编辑redis.conf文件
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
save 900 1
save 300 10
save 60 10000
- 重新启动redis服务器,并指定配置文件名称
redis-server redis.conf文件位置
数据将默认保存在dump.rdb文件中
3. rdb的备份与恢复
1. 备份:将*.rdb文件拷贝到别的地方
2. 恢复:将备份的文件拷贝回原来的目录,文件名需要和redis.conf中的dbfilename属性值一致,默认为dump.rdb
2.AOF持久化方式(append of file )
- 编辑redis.conf文件
appendonly no(默认值no表示关闭AOF持久化方式)
// 开启AOF持久化方式
// AOF 和 RDB 同时开启,系统默认取 AOF 的数据
appendonly yes
appendfsync always:每一次操作都持久化
appendfsync everysec:每隔一秒都进行持久化
appendfsync no:不主动进行持久化,将同步时机交给操作系统。
- 重新启动redis服务器,并指定配置文件名称
redis-server redis.conf
数据将保存在appendonly.aof文件中
3. aof的备份与恢复与rdb类似