目录
1.Redis五大数据类型及使用场景:
- String:Redis的字符串是动态字符串,内部表示是一个字符数组,这里提Python的字符串是无法修改的。一般用来做一些复杂的计数功能的缓存(项目里使用了字符串来记录毫米级时间)
SET KEY VALUE #设置或修改一个字符串
GET #获取
MSET #多次添加
MGET KEY1 KEY2...
INCR KEY #使一个整型的KEY自增1 "18"
INCRBY #设定自增步长,也可以用来自减,等同于DECR
INCRBYFLOAT #浮点数增长
SETNX KEY VALUE #如果存在,不修改,不存在则新建 等同于SET KEY VALUE NX
SETEX KET VALUE #添加一个KEY,并设置有效期
- List:底层为一个双向链表结构,有序,一般用来做消息队列
LPUSH KEY ELEMENT... #从左侧插入一个元素
LPOP KEY [COUNT] #从左侧弹出一个元素
RPUSH KEY ELEMENT #从右侧插入一个元素
RPOP KEY #从右侧弹出一个元素
LRANGE KEY START END #返回从START到END的所有元素
BLPOP BRPOP #和前面类似,区别在于如果没有元素时使用该指令会等待指定时间,而不是直接返回nil
- Hash:散列,无序字典,存储、读取、修改对象属性
HSET KEY FIELD VALUE
HGET KEY FIELD
HMSET KEY FIELD1 VALUE1 FIELD2 VALUE2
HMGET KEY FIELD1 FIELD2
HGETALL #获取该KEY的所有键值对
HKEYS #获取Hash类型所有的KEY(FIELD)
HVALS #获取KEY中所有的值
HINCRBY #让一个Hash类型的KEY字段值增长指定步长
HSETNX #
顺带提一嘴,Redis中无法给Hash的元素和Set的元素设置过期时间,但是可以给整个Set或Hash设置过期时间。至于为什么Redis不给这些类型的元素设置过期时间是因为不可能支持这样的 feature,因为违背了 Redis 的设计理念:简单、高效。 不过,在 Google Group 上看到 Redis 的作者针对这类需求给出了 2 个实现方案
- Set:集合。无序,查找快,元素无重复,支持集合运算
SADD KEY MEMBER #增
SREM KEY MEMBER #删
SCARD KEY #返回元素个数
SISMEMBER KEY MEMBER #判断元素是否属于集合
SMEMBERS KEY #获取KEY中所有的MEMBER
- SortedSet:有序集合,查找快,元素无重复,每个元素都带有一个double类型的score
ZADD key score member #添加一个或多个元素到sorted set,如果已经存在则更新其score值
ZREM key member #删除sorted set中的一个指定元素
ZSCORE key member #获取sorted set中的指定元素的score值
ZRANK key member #获取sorted set中的指定元素的排名
ZCARD key #获取sorted set中的元素个数
ZCOUNT key min max #统计score值在给定范围内的所有元素的个数
ZINCRBY key increment member #让sorted set中的指定元素自增,步长为指定的increment值
ZRANGE key min max #按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max #按照score排序后,获取指定score范围内的元素
ZDIFF、ZINTER、ZUNION #求差集、交集、并集
PS:set和zset的元素都是字符串类型
set一般使用在有共同特点的场景上,zset可以用来做排行等
更加详细请参考:Redis五种数据类型及应用场景 - 腾讯云开发者社区-腾讯云 (tencent.com)
2.Redis是单线程还是多线程
无论什么版本,工作线程(执行命令的核心模块)只有一个。在6.x版本中出现了IO多线程,需要注意的是这个 Theaded IO 指的是在网络 IO 处理方面上了多线程,如网络数据的读写和协议解析等
为什么Redis很快?还是单线程?
个人理解:Redis快的原因无非两个重要原因:①Redis是基于内存的数据库,所有的操作都在内存上进行②Redis都是简单的key-value数据结构,所以比较快,据官方给出的数据,redis在一个普通的linux上部署,一秒内可以发送一百万的请求,如果还不能满足需求,官方推荐启动多个Redis实例。如果使用多线程还需要考虑数据安全性,再者操作数据时需要加锁,进而也影响了程序的执行速度和效率。总的来说Redis单线程已经够快了,完全没有必要采用多线程。
3.Redis性能的瓶颈
于上个问题可知Redis的瓶颈不在CPU,主要是①机器内存和②网络带宽(网络状态)
4.Redis为什么效率高
①因为它是内存数据库;
②归功于它的数据结构;
③Redis 中是单线程;
④Redis 中使用了多路复用。
5.Redis和MySQL的区别
- 数据层面:
MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢 Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
- 使用场景
MySQL用于持久化的存储数据到硬盘,功能强大,但是速度较慢 Redis用于存储使用较为频繁的数据到缓存中,读取速度快.
- 存放位置
MySQL:数据放在磁盘 Redis:数据放在内存