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中进行的。
本文来自博客园,作者:diligently,转载请注明原文链接:https://www.cnblogs.com/luo12828-foxmail/p/16964213.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)