- redis中所有数据类型都是键值对形式存在
- 键都是字符串型,值可以为各种类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
常用命令
删除一个键值对 创建数据类型时如果键已存在会报错
del 键名 命令执行后输出 (integer) 1,否则将输出 (integer) 0
flushdb 清空数据库(清空当前库)
flushall 清除全部库的数据
select index index>0 切换数据库,不同库 默 认16个库
keys * 输出所有键
clear 清屏
expire 键 秒数 设置键值对过期时间
ttl 键 查看key的剩余时间。存在但是未设置时效为-1。过期为-2,查不存在的key也为-2.因为键过期即被删除不存在
type 键 查看数据类型
exists 键 查看key是否存在
move 键 把一个key移动到其他库
ping 测试连接,正常返回PONG
auth 密码 使用密码
redis-cli.exe -a 密码 连接时就指定密码
bigkey
如果一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey。除了会消耗更多的内存空间,bigkey 对性能也会有比较大的影响
- string 类型的 value 超过 10 kb,复合类型的 value 包含的元素超过 5000 个(对于复合类型的 value 来说,不一定包含的元素越多,占用的内存就越多) 就算bigkey
可以通过分析rdb文件找bigkey
- redis-rdb-tools(opens new window) :Python 语言写的用来分析 Redis 的 RDB 快照文件用的工具
- rdb_bigkeys(opens new window) : Go 语言写的用来分析 Redis 的 RDB 快照文件用的工具,性能更好。
字符串
string 是 redis 最基本的类型
- 字符串引号是可有可无的,但是推荐字符串作为值时加引号
- string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
- string 类型的值最大能存储 512MB。同时一个键也是最大能存储 512MB
- 字符串键貌似不能为中文,值可以为中文 ```shell set name “饶泽东” ok get name “饶泽东”
incr 键 将数字值+1 decr 键 数字 -1 decrby 键 值 数字值减少指定值 incrby 键 值 数字增加值 append 键 值 字符串值追加值
<a name="pcdVl"></a>
# 哈希
- 哈希类似Map,是一组键值对的集合,所以特别适合用于存储对象
- **哈希中的键值对的值都是字符串**
- 每个 hash 可以存储 232 -1 键值对(40多亿)
```shell
创建
hmset 对象名 属性1 属性1值 属性2 属性2值 ...
获取对象属性
hget 对象名 属性名
hset key 属性 value 设置某个属性
List
- 一个键有很多个值的类型
- list的插入顺序类似栈,先插入的会在最下面输出
- 列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。 ```shell lpush 键 值 插入一个,没有则创建
lrange 键 int1 int2 输出索引1-2之间的元素 list可以看成是0索引开始的集合 如0 2 即输出第一个和第二个 0 0 即输出第一个
lrange 键 0 -1 输出所有元素
<a name="N4Khd"></a>
# Set
- Redis 的 Set 是 string 类型的无序集合。不允许重复值。通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
```shell
sadd 键 值 插入一个到set中,无则创建。成功返回 1,如果元素已经在集合中返回 0
(integer) 1
smembers 键 输出所有元素
zset 有序集合
- Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数大小来为集合中的成员进行从小到大的排序。
- 如果多个分数相同,此时貌似又是无序输出
zset的成员是唯一的,但分数(score)却可以重复。即插入已存在元素,值会被过滤不会再插入,但是分数会刷新
zadd 键 分 值 #插入一个元素
zrangebyscore
bitmap
bitmap 存储的是连续的二进制数字(0 和 1),通过 bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态。总之相当于一组bit数组,数组只能存储0或者1(索引0开始,默认为0)
- 适合用于存储状态等信息,用户 ID 为 offset
- rdm里面要看bitmap,使用binary格式(二进制) ```sql setbit xx 7 1 #如果bitmap长度小于7+1,则扩充;设置第七位为0 (integer) 0 #会返回之前存储的值,默认为0 getbit xx 7 #获取第七位的值 (integer) 1
bitcount xx #统计bitmap里为1的位的数量
```java
bitop 位运算操作 保存结果的键值 key/[key ...]
位运算操作有AND 、 OR 、 NOT 、 XOR 这四种操作
运算结果会自动创建并存储到设置的键值对
key可以是一个bitmap或者多个bigmap,多个时用空格分隔
127.0.0.1:6379> setbit 20210308 1 1
127.0.0.1:6379> setbit 20210308 2 1
127.0.0.1:6379> setbit 20210309 1 1
#统计 20210308~20210309 总活跃用户数(应该是一直活跃的意思): 1
bitop and desk1 20210308 20210309 #即011与010&运算,得010
bitcount desk1 #结果1
#统计 20210308~20210309 在线活跃用户数: 2
127.0.0.1:6379> bitop or desk2 20210308 20210309,得011
(integer) 1
127.0.0.1:6379> bitcount desk2
(integer) 2
空
nil
即null