Redis-五大数据类型&设置

redis这么快的原因:

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

4、使用多路I/O复用模型,非阻塞IO;

5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

以上几点都比较好理解,下边我们针对多路 I/O 复用模型进行简单的探讨:

(1)多路 I/O 复用模型

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。

Redis的五大数据

➢ keys  * 

• 查询当前库的所有键

➢ exists  <key>

 • 判断某个键是否存在

➢ type  <key>  

 • 查看键的类型

➢ del  <key>

 • 删除某个键

➢ expire   <key>   <seconds> 

• 为键值设置过期时间,单位秒。

、➢ ttl   <key> 

• 查看还有多少秒过期,-1表示永不过期,-2表示已过期

➢ dbsize 

• 查看当前数据库的key的数量

需要慎用的两个命令:

因为在linux操作行中,redis中只要登录进去了,下面的操作是可以执行的

➢ flushdb 

• 清空当前库

➢ flushall 

• 通杀全部库

三、String

➢String是Redis最基本的类型,你可以理解成与 Memcached一模一样的类型,一个key对应一个value。
➢String类型是二进制安全的。意味着Redis的string可以 包含任何数据。比如jpg图片或者序列化的对象 。

➢String类型是Redis最基本的数据类型,一个Redis中字 符串value最多可以是512M

➢ get   <key> 

• 查询对应键值 

➢ set   <key>  <value>

 • 添加键值对

➢ append  <key>  <value> 

• 将给定的<value> 追加到原值的末尾

➢ strlen <key> 

• 获得值的长度

➢ setnx  <key>  <value>

• 只有在 key 不存在时设置 key 的值 

➢ incr <key>

 • 将 key 中储存的数字值增1 

• 只能对数字值操作,如果为空,新增值为1 

➢ decr <key> 

• 将 key 中储存的数字值减1 

• 只能对数字值操作,如果为空,新增值为-1

➢ incrby / decrby <key>  <步长> 

• 将 key 中储存的数字值增减。自定义步长

 

➢ 原子性

• 所谓原子操作是指不会被线程调度机制 打断的操作;这种操作一旦开始,就一 直运行到结束,中间不会有任何 context switch (切换到另一个线程)。

(1) 在单线程中, 能够在单条指令中完成的操作都可以认为是" 原子操作", 因为中断只能发生于指令之间。 (2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。

Redis单命令的原子性主要得益于Redis的单线程

 

➢ mset <key1>  <value1>  <key2>  <value2>  ..... 

• 同时设置一个或多个 key-value对 

➢ mget <key1>   <key2>   <key3> ..... 

• 同时获取一个或多个 value  

 

➢ msetnx <key1>  <value1>  <key2>  <value2>  ..... 

 

• 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

 

➢ getrange <key>  <起始位置>  <结束位置> 

• 获得值的范围,类似java中的substring

➢ setrange <key>   <起始位置>   <value> 

• 用 <value> 覆写<key> 所储存的字符串值,从<起 始位置>开始

 

➢ setex <key>  <过期时间>   <value>

• 设置键值的同时,设置过期时间,单位秒。

 

➢ getset <key>  <value>

 

• 以新换旧,设置了新值同时获得就值

List 

➢ 单键多值 

➢ Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元 素导列表的头部(左边)或者尾部(右边)。

 ➢ 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操 作中间的节点性能会较差。

 

➢ lpush/rpush <key>  <value1>  <value2>  <value3> ....

 • 从左边/右边插入一个或多个值。 ➢ lpop/rpop <key> 

• 从左边/右边吐出一个值。

 • 值在键在,值光键亡。

➢ rpoplpush <key1>  <key2>

• 从<key1>列表右边吐出一个值,插到<key2>列表左边。

 

➢ lrange <key> <start> <stop>

• 按照索引下标获得元素(从左到右)

 

➢ lindex <key> <index>

• 按照索引下标获得元素(从左到右)

 

➢ llen <key>

• 获得列表长度

➢ linsert <key>  before <value>  <newvalue> 

• 在<value>的后面插入<newvalue> 插入值

➢ lrem <key> <n>  <value> 

• 从左边删除n个value(从左到右)

--Set

 

➢Redis set对外提供的功能与list类似是一个列表的功能, 特殊之处在于set是可以自动排重的,当你需要存储一个 列表数据,又不希望出现重复数据时,set是一个很好的 选择,并且set提供了判断某个成员是否在一个set集合内 的重要接口,这个也是list所不能提供的。

➢Redis的Set是string类型的无序集合。

它底层其实是一 个value为null的hash表,所以添加,删除,查找的复杂 度都是O(1)。

➢ sadd <key>  <value1>  <value2> ..... 

• 将一个或多个 member 元素加入到集合 key 当中,已 经存在于集合的 member 元素将被忽略

➢ smembers <key>

 • 取出该集合的所有值

➢ sismember <key>  <value> 

• 判断集合<key>是否为含有该<value>值,有返回1, 没有返回0

 

➢ scard <key>

• 返回该集合的元素个数。

 

➢ srem <key> <value1> <value2> ....

• 删除集合中的某个元素。

➢ spop <key>  

• 随机从该集合中吐出一个值。

➢ srandmember <key> <n>

• 随机从该集合中取出n个值。 • 不会从集合中删除

 

➢ sunion <key1> <key2>  

• 返回两个集合的 并集元素。

 

➢ sinter <key1> <key2>  

• 返回两个集合的交集元素。

➢ sdiff <key1> <key2>  

• 返回两个集合的差集元素。

-->hash

➢ Redis hash 是一个键值对集合。
➢ Redis hash是一个string类型的field和value的映射表,
hash特别适合用于存储对象。

➢ 类似Java里面的Map<String,Object>

 

➢ hset <key>  <field>  <value>

• 给<key>集合中的 <field>键赋值<value>

➢ hget <key1>  <field>   

• 从<key1>集合<field> 取出 value

➢ hmset <key1>  <field1> <value1> <field2> <value2>...   

• 批量设置hash的值

 hexists key  <field>
• 查看哈希表 key 中,给定域 field 是否存在。

➢ hkeys <key>   

➢ hvals <key>   

➢ hsetnx <key>  <field> <value>

• 为哈希表 key 中的域 field 的值加上增量 increment
• 列出该hash集合的所有field
• 列出该hash集合的所有value

➢ hincrby <key> <field>  <increment>

• 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .

 

-->zset  (sorted set)

Redis有序集合zset与普通集合set非常相似,是 一个没有重复元素的字符串集合。不同之处是有序集合 的没有成员都关联了一个评分(score) ,这个评分 (score)被用来按照从最低分到最高分的方式排序集 合中的成员。集合的成员是唯一的,但是评分可以是重 复了 。 因为元素是有序的, 所以你也可以很快的根据评分 (score)或者次序(position)来获取一个范围的元 素。访问有序集合的中间元素也是非常快的,因此你能够 使用有序集合作为一个没有重复成员的智能列表。 

 

➢ zadd  <key> <score1> <value1>  <score2> <value2>...

• 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。

➢ zrange <key>  <start> <stop>  [WITHSCORES]   

➢ zrangebyscore key min max [withscores] [limit offset count]

• 返回有序集 key 中,下标在<start> <stop>之间的元素 • 带WITHSCORES,可以让分数一起和值返回到结果集。
• 返回有序集 key 中,所有 score 值介于 min 和 max 之间 (包括等于 min 或 max )的成员。有序集成员按 score 值递 增(从小到大)次序排列。

➢ zrevrangebyscore key max min [withscores] [limit offset count]

• 同上,改为从大到小排列。

 

➢ zincrby <key> <increment> <value>

• 为元素的score加上增量

 

➢ zrem <key>  <value>  

• 删除该集合下,指定值的元素

 

➢ zcount <key>  <min>  <max> 

• 统计该集合,分数区间内的元素个数

 

➢ zrank <key>  <value> 

• 返回该值在集合中的排名,从0开始

-->Redis相关配置

➢ 计量单位说明

➢ 大小写不敏感

➢include

类似jsp中的include,多实例的情况可以把公用的配 置文件提取出来

 

➢ip地址的绑定(bind)

默认情况bind=127.0.0.1只能接受本机的访问请求
不写的情况下,无限制接受任何ip地址的访问
生产环境肯定要写你应用服务器的地址

如果开启了protected-mode,那么在没有设定bind ip且 没有设密码的情况下,Redis只允许接受本机的响应

 

➢tcp-backlog

可以理解是一个请求到达后至到接受进程处理前的队列
backlog队列总和=未完成三次握手队列 +  已经完成 三次握手队列

高并发环境tcp-backlog 设置值跟超时时限内的Redis 吞吐量决定

➢timeout

 一个空闲的客户端维持多少秒会关闭,0为永不关闭

 

➢TCP keepalive

 对访问客户端的一种心跳检测,每个n秒检测一次。

官方推荐设为60秒。

 

➢daemonize

是否为后台进程

➢ pidfile

存放pid文件的位置,每个实例会产生一个不同的pid文件

 

➢ log level 

四个级别根据使用阶段来选择,生产环境选择notice 或者 warning

➢ logfile 

日志文件名称

 

➢ syslog

是否将Redis日志输送到linux系统日志服务中

➢ syslog-ident

日志的标志 

➢ syslog-facility 

输出日志的设备

➢ database 

设定库的数量 默认16

 

➢ security

• 在命令行中设置密码

 

➢ maxclient

• 最大客户端连接数

➢ maxmemory 

• 设置Redis可以使用的内存量。一旦到达内存使用上限,

Redis将会试图移除内部数据,移除规则可以通过
maxmemory-policy来指定。如果Redis无法根据移除规则来

移除内存中的数据,或者设置了“不允许移除”, 

• 那么Redis则会针对那些需要申请内存的指令返回错误信息,

比如SET、LPUSH等。

 

➢ Maxmemory-policy

(1)volatile-lru:使用LRU算法移除key,只对设置了过期时间的

(2)allkeys-lru:使用LRU算法移除key
(3)volatile-random:在过期集合中移除随机的key,只对设置了
过期时间的键
(4)allkeys-random:移除随机的key
(5)volatile-ttl:移除那些TTL值最小的key,即那些最近要过期
的key

(6)noeviction:不进行移除。针对写操作,只是返回错误信息

 

➢ Maxmemory-samples

• 设置样本数量,LRU算法和最小TTL算法都并非是精确的算 法,而是估算值,所以你可以设置样本的大小。 

• 一般设置3到7的数字,数值越小样本越不准确,但是性能 消耗也越小

 

扩展

以下也是你应该知道的几种模型,祝你的面试一臂之力!

1、单进程多线程模型:MySQL、Memcached、Oracle(Windows版本);

2、多进程模型:Oracle(Linux版本);

3、Nginx有两类进程,一类称为Master进程(相当于管理进程),另一类称为Worker进程(实际工作进程)。启动方式有两种:

(1)单进程启动:此时系统中仅有一个进程,该进程既充当Master进程的角色,也充当Worker进程的角色。

(2)多进程启动:此时系统有且仅有一个Master进程,至少有一个Worker进程工作。

(3)Master进程主要进行一些全局性的初始化工作和管理Worker的工作;事件处理是在Worker中进行的。

posted @   diligently  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示