Redis
redis中文官网
搜索redis命令中文参考redis命令
Redis基础
关系型数据库与非关系型数据库区别
应用场景
不同数据库比较
缓存读取过程:
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题解释参考
一致哈希算法参考
Redis数据类型
string字符串类型
数据结构:
- 常用命令
- 自增自减
- 其他操作
- 获取字符串长度
- 往字符串append内容
- 设置和获取字符串的某一段内容
- 设置及获取字符串的某一位(bit)
- 批量设置一系列字符串的内容
//ex:秒级过期时间,nx:键不存在时才能设置成功,xx键存在时才能设置成功
set key value [ex seconds] [px milliseconds] [nx|xx]
get key
mset key value [key value ...]
mset a 1 b 2 c 3 d 4
mget key [key ...]
mget a b c d
incr key
append key value
strlen key
getset key value
setrange key offeset value
//例子
set redis pest
setrange redis 0 b
get redis
结果:"best"
getrange key start end
使用场景:
缓存
// 定义键
userRedisKey = "user:info:" + id;
// 从 Redis 获取值
value = redis.get(userRedisKey);
if (value != null) {
// 将值进行反序列化为 UserInfo 并返回结果
userInfo = deserialize(value);
return userInfo;
}
计数:点赞,视频播放量,每播放一次就+1
long incrVideoCounter(long id) {
key = "video:playCount:" + id;
return redis.incr(key);
}
接口防刷:验证码登录,公司一般的验证码等发短信功能都是调用的第三方接口,如果被有心之人利用了,会给公司造成一定的损失,所以简单的解决方法就是限流
phoneNum = "138xxxxxxxx";
key = "shortMsg:limit:" + phoneNum;
// SET key value EX 60 NX
isExists = redis.set(key,1,"EX 60","NX");
if(isExists != null || redis.incr(key) <=5){
// 通过
}else{
// 限速
}
list列表类型
Redis中的List其实就是链表(redis 使用双端链表实现的 List),一个List结构可以有序的存储多个字符串,并且是允许元素重复的。
常用命令:
- LPUSH和RPUSH命令分别用于将元素推入列表的左端和右端;LPOP和RPOP命令分别用于从列表的左端和右端弹出元素,也就是删除元素;
- 其中对于LRANGE命令来说,使用0位范围的起始索引,-1为范围的结束索引,可以取出列表包含元素的所有元素
set集合类型
- Redis的集合和列表都可以存储多个字符串,他们的不同支持在于,列表可以存储多个相同的字符串,而集合通过使用散列表来保证自己存储的每个字符串都是各不相同的。
- Redis的集合使用的是无序的方式存储元素,所以不可以像List列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。
常用命令
交集、并集、差集的计算
hash散列类型
Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户同样可以对散列存储的数字执行自增操作或者是自减操作。
Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题
常用命令
添加和删除键值对的命令、获取所有键值对的命令、以及对键值对的值进行自增和自减操作的命令
//设置值
hset key field value
//获取值
hget key field
//删除field
hdel key field [field ...]
//计算field个数
hlen key
//批量设置或获取field-value
hmset key field value [field value ...]
hmget key field [field ...]
//判断field是否存在
hexists key field
//获取所有field
hkeys key
//获取所有value
hvals key
//获取所有的field-value
hgetall key
//以某种形式自增
hincrby key field
hincrbyfloat key field
//计算value的字符串长度
hstrlen key field
zset有序集合类型
- 有序集合和散列一样,用于存储键值对;有序集合的键被称为成员member,每一个成员都是独一无二的;而有序集合的值被称为分值score,分值必须是浮点数
- 有序集合是Redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排序来访问元素的结构。
一个有序集合类型的实例,zset-key是一个包含两个元素的有序集合键:
常用命令
redis的底层数据结构参考
# 每行按空格或TAB分割,输出文本中的1、4项
$ awk '{print $1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
# 格式化输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
---------------------------------------------
2 a
3 like
This's
10 orange,apple,mongo
参考资料