Redis的数据结构
五种数据类型
- 字符串(String)
- 哈希(hash)
- 字符串列表(list)
- 字符串集合(set)
- 有序字符串集合(sorted set)
Key定义的注意点
- 不要太长
不要超过1024字节 可能会降低查找效率
- 不要太短
会降低key的可读性
- 统一的命名规范
例如 user:123456789,user:987654321
存储String
- 二进制安全的,存入和获取的数据相同
- Value最多可以容纳的数据长度是512M
字符串基本命令
命令 | 操作 | 结果解释 |
---|---|---|
set | set home xiaogao | set key 为 home 值为xiaogan |
get | get home | 返回 xiaogan |
getset | getset home wuhan | 获取home 并更改home的值为wuhan |
del | del people | 删除键为peoplo的数据 |
incr | incry num | 设置num 为自增 |
decr | decr num | 设置num 为自减 |
incrby | incrby num5 5 | 设置num5 为自增 且跨度为5 |
decrby | decrby num5 3 | 设置num5 为自减 且跨度为3 |
append | append num5 123 | 在num5键所对应的值后面添加123 |
存储Hash
- String Key和String Value的map容器
- 每一个Hash可以存储4294967295个键值对
Hash基本命令
命令 | 操作 | 结果解释 |
---|---|---|
hset | hset myhash username whh | key为myhash的哈希中set一个key为username 值为 whh的键值对 |
hget | hget myhash username | 获取key为myhash的哈希的username |
hmset | hmset pojo username tom age 18 | key为pojo的哈希中set两个 username tom和age 18 键值对 |
hmget | hmget pojo username age | 获取pojo哈希中的username和age的值 |
hgetall | hgetall pojo | 输出为"username" "whh" "age" "18" |
hdel | hdel pojo username | 删除pojo中的username键值对 |
hincrby | hincrby pojo age 2 | pojo中的age的值变为20 |
hexists | hexists pojo sex | 判断pojo哈希中是否存在sex的键,存在返回1不存在返回0 |
hlen | hlen pojo | 判断pojo哈希中又多少个键值对 |
hkeys | hkeys pojo | "username" "age" |
hvals | 命令 | "tom" "18" |
存储list
- ArrayList使用数组方式
- LinkedList使用双向链接方式
- 双向链表中增加数据
- 双向链表中删除数据
存储list常用命令
- lpush rpush 两端添加
- rpop 两端弹出
- lrange 查看列表
- 扩展命令
- 获取列表元素个数
命令 | 操作 | 结果解释 |
---|---|---|
lpush | lpush listleft a b c 1 2 3 | 表示从左侧插入,元素顺序 list:[3 2 1 c b a] |
rpush | lpush listright a b c 1 2 3 | 表示从右侧插入,元素顺序 list:[a b c 1 2 3] |
rpop | rpop listleft | 元素顺序变为 list:[3 2 1 c b a] |
lrange | lrange listleft 0 -1 | 便利所有元素,0表示第一个元素(star),-1表示最后一个元素(end) |
llen | llen listleft | 查看listleft列表的长度 |
lpushx | lpushx listleft x | 在listleft中最左边插入元素x |
lrem | lrem test 3 3 | test:[1 2 3 1 2 3 1 2 3]执行操作后list:[1 2 1 2 1 2]第一个三大于0从左边开始删除值为3的元素删除3个 |
lset | lset test 2 hhh | 把test的列表角标为2的元素替换成hhh |
linsert | linsert test before 2 hhh | 把test的列表角标第一个元素2之前插入一个元素hhh |
linsert | linsert test after 2 hhh | 把test的列表角标第一个元素2之后插入一个元素hhh |
rpoplpush | rpoplpush list1 list2 | 删除list1的右边的元素删除插入到list2z |
存储Set
- 和List不同的是Set集合中不允许出现重复元素
- Set可包含的最大元素数量是4294967295
存储Set常用命令
- 添加删除元素
- 获得集合中的元素
- 集合中的差集运算
- 集合中的交集运算
- 集合中的并集运算
- 扩展命令
命令 | 操作 | 结果解释 |
---|---|---|
sadd | sadd myset a b c | 向myset集合中添加 a b c 三个元素 |
srem | sadd myset c | myset集合中删除 c 元素 |
smembers | smembers myset | 查看myset集合中的元素 |
sismember | sismember myset 9 | 查看myset集合中有没有元素9 有返回1没有返回0 |
sdiff | sdiff set1 set2 | 差集 |
sinter | sinter set1 set2 | 交集 |
sunion | sunion set1 set2 | 并集 |
scard | scard set1 | set1集合中元素的数量 |
randmember | randmember set1 | 随机获取set1集合中的一个元素 |
sdiffstore | sdiffstore s set1 set2 | set1与set2的差集存储到s集合中 |
sinterstore | sinterstore s set1 set2 | set1与set2的交集存储到s集合中 |
存储Sorted-set有序集合
命令 | 操作 | 结果解释 |
---|---|---|
zadd | zadd mysort 70 zs 80 ls 90 ww | 有序的键值对根据数字从低到高升序 |
zscore | zscore mysort ww | 获取ww的值 |
zrem | zrem mysort ww | 删除ww |
zcard | zcard mysort | 获取mysort的长度 |
zrange | zrange mysort 0 -1 | 获取所有的key(有序的) |
zrange | zrange mysort 0 -1 withscores | 获取所有的键值对从小到大 |
zrevrange | zrevrange mysort 0 -1 withscores | 获取所有的键值对从大到小 |
zremrangebyrank | zremrangebyrank mysort 0 3 | 按范围删除m'y'sort的元素 |
Redis特性
多个数据库 默认使用第一个数据库,总共又16个分别是0-15
Redis事务
- multi 开始事务
- exec 提交事务
- discard 事务回滚
Redis持久化方式的四种方式
redis 高性能是因为在内存中,
内存中同步到硬盘中就是持久化操作
- RDB方式 指定的时间内,把数据写入到磁盘一次
- AOF方式 将操作日志保存下来,启动redis,重新构建
- 不持久化
- 同时 RDB方式 AOF方式
rdb方式:
优势:只有一个文件,时间间隔的数据,可以归档为一个文件,方便压缩转移(就一个文件)
劣势:如果宕机,数据损失比较大,因为它是没一个时间段进行持久化操作的。也就是积攒的数据比较多,一旦懵逼,就彻底懵逼了
配置文件: redis.windows.conf
RDB方式:
194行
save 900 1 // 900秒 至少1个key发生变化就写入磁盘
save 300 10 // 300秒 至少10个key发生变化就写入磁盘
save 60 10000 // 60秒 至少10000个key发生变化就写入磁盘
228行
dump.rdb // 文件名 The filename where to dump the DB
238行
dir ./ //当前文件目录
AOF持久化
优势:数据安全, 每秒同步,每修改同步,不同步
劣势:如果宕机 这1s的数据就没了。
每修改同步,安全,但是效率慢。
对于日志的写入方式采用append模式,在写的过程中发生宕机,写了一半,宕机,下次启动前工具会解决数据一致性问题。如果日志过大,redis会启动重写日志。
配置文件:redis.windows.conf
在redis.windows.conf中开启 appendnly yes 581行
选择一种同步策略 appendfsync always(每次操作同步,效率低,最安全)、everysec(每秒同步) 、no(不同步)