如今是8102年了,作为一个老牌的缓存数据库redis,依然非常强劲。准备把它系统地过一遍,计划分两部分来进行:
1.redis使用
2.redis原理分析
redis通识
命令
这些是通用命令,对所有redis的数据结构都可以操作
expire 设置过期时间
del 删除键值
操作结果
正常操作返回OK 或 (integer) 加数字
更新操作返回(integer) 0
空值是 (nil)
redis的数据结构
Redis 有 5 种常用的基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)
除了这5种还有bitmap,hyperloglog等,本次只介绍这5种。
Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。
字符串
设置键值对
127.0.0.1:6379> set name1 boy
OK
获取该键值
127.0.0.1:6379> get name1
"boy"
批量设置
127.0.0.1:6379> mset name1 boy name2 girl name3 none
OK
批量获取
127.0.0.1:6379> mget name1 name2 name3
1) "boy"
2) "girl"
3) "none"
设置过期时间
用set + codehole
127.0.0.1:6379> SETEX name1 2 codehole #设置2秒过期
OK
127.0.0.1:6379> get name1 #2秒后该键值消失
(nil)
用expire
127.0.0.1:6379> expire name2 2
(integer) 1
127.0.0.1:6379> get name2
(nil)
计数
如果 value 值是一个整数,还可以对它进行自增操作。
127.0.0.1:6379> set val 27
OK
127.0.0.1:6379> get val
"27"
127.0.0.1:6379> INCR val #自增1
(integer) 28
127.0.0.1:6379> get val
"28"
127.0.0.1:6379> INCRBY val 5 #加5
(integer) 33
127.0.0.1:6379> get val
"33"
127.0.0.1:6379> INCRBY val -3 #减3
(integer) 30
127.0.0.1:6379> get val
"30"
列表
可以理解为数据结构中的双向链表,常用于队列。
向列表中添加元素(右边进)
127.0.0.1:6379> rpush books python php golang c #右边进
(integer) 4
#lpush是左边进,后面的例子都是右边进的
查看该列表长度
127.0.0.1:6379> llen books
(integer) 4
查看该列表的元素
127.0.0.1:6379> lrange books 0 3
1) "python"
2) "php"
3) "golang"
4) "c"
查看该列表的所有元素
127.0.0.1:6379> lrange books 0 -1
1) "python"
2) "php"
3) "golang"
4) "c"
右边进左边出(先进先出):队列
127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> lrange books 0 3
1) "php"
2) "golang"
3) "c"
右边进右边出(先进后出):栈
127.0.0.1:6379> rpop books
"c"
127.0.0.1:6379> lrange books 0 3
1) "php"
2) "golang"
当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
127.0.0.1:6379> rpop books
"golang"
127.0.0.1:6379> rpop books
"php"
127.0.0.1:6379> lrange books 0 3
(empty list or set)
lindex索引
慎用
127.0.0.1:6379> rpush books python php golang c
(integer) 4
127.0.0.1:6379> lindex books 2 #正方向
"golang"
127.0.0.1:6379> lindex books -3 #反方向
"php"
ltrim保留范围内的值
慎用
127.0.0.1:6379> ltrim books 1 2 #保留范围是1到2的值
OK
127.0.0.1:6379> lrange books 0 3
1) "php"
2) "golang"
字典
是无序字典。
创建一个字典
127.0.0.1:6379> hset books golang "hello golang"
(integer) 1
127.0.0.1:6379> hset books php "hello php"
(integer) 1
127.0.0.1:6379> hset books python "hello python"
(integer) 1
127.0.0.1:6379> hset books c "hello c"
(integer) 1
获取该字典的所有元素
127.0.0.1:6379> hgetall books
1) "golang"
2) "hello golang"
3) "php"
4) "hello php"
5) "python"
6) "hello python"
7) "c"
8) "hello c"
获取指定key的元素
127.0.0.1:6379> hget books golang
"hello golang"
更新指定的key
127.0.0.1:6379> hset books golang "hi golang"
(integer) 0
127.0.0.1:6379> hget books golang
"hi golang"
设置多个
127.0.0.1:6379> hmset books java "hi java" js "hi js"
OK
计数
127.0.0.1:6379> hset books page 100
(integer) 1
127.0.0.1:6379> HINCRBY books page 1
(integer) 101
127.0.0.1:6379> hget books page
"101"
集合
集合内的键值对是唯一无序的,它和列表的区别是:列表是序的,可重复的。
添加一个元素
127.0.0.1:6379> sadd books python
(integer) 1
127.0.0.1:6379> smembers books #查看值
1) "python"
127.0.0.1:6379> sadd books python #重复添加
(integer) 0
127.0.0.1:6379> smembers books #还是只有一个
1) "python"
127.0.0.1:6379>
检查某个值是否存在
127.0.0.1:6379> sismember books abc #不存在abc
(integer) 0
127.0.0.1:6379> sismember books python #python存在
(integer) 1
获取长度
127.0.0.1:6379> sadd books php
(integer) 1
127.0.0.1:6379> scard books
(integer) 1
127.0.0.1:6379> sadd books go
(integer) 1
127.0.0.1:6379> scard books
(integer) 2
弹出
127.0.0.1:6379> sadd books python php go
(integer) 1
127.0.0.1:6379> spop books #弹出一个
"python"
127.0.0.1:6379> smembers books
1) "php"
2) "go"
有序集
可以理解为加强型的集合,它可以对value设置一个score,用来排序
添加元素
127.0.0.1:6379> zadd user 98 xiaohong #添加个用户xiaohong,值是98
(integer) 1
127.0.0.1:6379> zadd user 99 xiaoming
(integer) 1
127.0.0.1:6379> zadd user 97 xiaoli
(integer) 1
127.0.0.1:6379> zadd user 98 xiaogang
(integer) 1
正序
127.0.0.1:6379> zrange user 0 -1
1) "xiaoli"
2) "xiaogang"
3) "xiaohong"
4) "xiaoming"
倒序
127.0.0.1:6379> zrevrange user 0 -1
1) "xiaoming"
2) "xiaohong"
3) "xiaogang"
4) "xiaoli"
获取score
127.0.0.1:6379> zscore user xiaohong
"98"
查看长度
127.0.0.1:6379> zcard user
(integer) 4
查看正序的排名
127.0.0.1:6379> zrank user xiaohong
(integer) 2
127.0.0.1:6379> zrank user xiaoli
(integer) 0
查看倒序的排名
127.0.0.1:6379> zrevrank user xiaohong
(integer) 1
127.0.0.1:6379> zrevrank user xiaoli
(integer) 3
查看某个范围的value
127.0.0.1:6379> zrangebyscore user 98 99
1) "xiaogang"
2) "xiaohong"
3) "xiaoming"
查看某个范围的value并返回对应的score
127.0.0.1:6379> zrangebyscore user 98 99 withscores
1) "xiaogang"
2) "98"
3) "xiaohong"
4) "98"
5) "xiaoming"
6) "99"
删除某个value
127.0.0.1:6379> zrem user xiaogang
(integer) 1