熟人做网站怎么收钱,个人简历自我介绍200字,在线音乐网站怎么做,网站建设销售员日升时奋斗#xff0c;日落时自省 注#xff1a;命令区分有点细#xff0c;择取自己需要的即可
目录
1、单机架构
2、数据库和应用分离
3、分布式基本概念
3.1、应用#xff08;Application#xff09;/系统(System)
3.2、模块#xff08;Module#xff09;/组件日落时自省 注命令区分有点细择取自己需要的即可
目录
1、单机架构
2、数据库和应用分离
3、分布式基本概念
3.1、应用Application/系统(System)
3.2、模块Module/组件Component
3.3、分布式Distributed
3.4、集群Cluster
3.5、主Master /从Slave
3.6、中间件Middleware
3.7、可用性Availability
3.8、响应时长Response Time RT
3.9、吞吐Throughputvs并发Concurrent
4、命令行客户端
4.1、连接redis
4.1.1、全局命令
4.2、String字符串
4.2.1、创建键值对
4.2.2、一次获取多个值
4.2.3、一次创建多个键值对
4.2.4、覆盖创建键值对
4.3、计数命令
4.3.1、单增命令
4.3.2、n增命令
4.3.3、单减命令
4.3.4、n减命令
4.3.5、浮点数加减
4.4、string获取相关命令
4.4.1、末尾追加命令
4.4.2、获取string指定区间
4.4.3、子串的覆盖
4.4.4、获取string长度
4.4.5、内部编码
4.5、Hash哈希
4.5.1、创建哈希键值对
4.5.2、删除键值对
4.5.3、获取hash中所有值
4.5.4、获取所有字段和对应值
4.5.5、一次获取hash多个字段值
4.5.6、hash所有字段的个数
4.5.7、内部编码
4.6、List列表
4.6.1、左侧插入
4.6.2、右侧插入
4.6.3、显示所有的list列表
4.6.4、左侧抛出元素
4.6.5、右侧抛出元素
4.6.6、获取index位置元素
4.6.7、特定位置插入元素
4.6.8、扩展命令
4.6.9、内部编码
4.7、Set集合
4.7.1、添加元素
4.7.2、判断key是否存在
4.7.3、获取集合内的个数
4.7.4、随机元素
4.7.5、指定元素删除
4.7.6、移动元素
4.7.7、内部编码
4.8、Zset有序集合
4.8.1、添加元素
4.8.2、获取一个zset的个数
4.8.3、取指定分数区间
4.8.4、按照降序进行排列
4.8.5、只返回元素列表
4.8.6、内部编码 在官方文档开头redis作用就存储数据但是不同于数据库的是“内存中存储” redis可以做的角色有很多可以做数据库、缓存、消息队列、消息代理针对这不同角色解释 数据库MySQL我们常见的数据库最大的问题在于访问速度比较慢很多互联网产品中对于性能要求是很高Redis作为数据库的话相较于MySQL的访问速度快
注经由对比才能说Redis很快但是既然是内存中操作拿数据量就小承受能力有限光快但是能存储的数据量不大
如何能做到快速且容量大
解决方案Redis和MySQL结合起来使用
不是所有数据都直接经过MySQL存储肯定都是存储在MySQL中的有足够大的容量来接收数据redis操作数据更快
针对所谓数据都有常用数据不常用数据也就衍生出了“二八原则”20%的热点数据能满足80%的访问需求不是说一定就是20%按照业务需求来定夺分配“一九”也不是没有
注系统的复杂程度大大提升分布式如果数据发生修改还涉及到Redis和MySQL之间的数据同步问题
消息队列Redis的初心最初就是用来作为一个“消息中间件”的消息队列分布式系统下的生产者消费者模型因为redis功能不是完全做消息队列的中间件的
Redis是在分布式系统中才会起的作用如果只是单击程序直接通过变量存储数据的方式就不用使用了Redis
1、单机架构
单机架构只有一台服务器这个服务器负责所有的工作也就是常规请求 单机程序中其实靠的不就是数据库信息的拉取嘛但是数据库也不是不能去掉光服务器负责所有操作单机架构是比较常见架构使用因为只有数据量够大的情况才会使用redis
一台主机的硬件资源是有上限的CPU、内存、硬盘、网络每次请求都会收到一个请求都是需要消耗上述的一些资源现在一台主机都够用不行了其实也可以增加硬件资源但是肯定硬件资源不能在加了就开始使用分布式
2、数据库和应用分离 一个应用服务器节点就要承受大量的请求一时是处理不了的影响到用户的体验感所以这里就针对大量数据做出优化措施
引入更多的应用服务器节点分匹配请求量就分开处理提高处理效率这里就提及到负载均衡器 负载均衡器主要作用就是任务分配请求分配具体的算法 应用服务器是要吃资源的CPU和内存要承受的了负载均衡器就分配给多个应用服务器解决资源问题这里有两个应用服务器如果是1w的请求量那可以每个服务器处理5k如同多线程 注这里只有展示了两个应用服务器但实际上不一定就是两个可以是多个 执行过程用户--(大量请求)--负载均衡器--(请求量分配)--应用服务器--存储服务器 3、分布式基本概念
3.1、应用Application/系统(System)
一个应用就是一个/组服务器程序
3.2、模块Module/组件Component
一个应用里面有很多个功能每个独立的功能就可以称为是一个模块/组件
3.3、分布式Distributed
引入多个主机/服务器协同配合完成一系列的工作物理上的多个主机
3.4、集群Cluster
引入多个主机/服务器,协同配合完成一系列的工作逻辑上的多个主机
3.5、主Master /从Slave
分布式系统中一种比较典型的结构
多个服务器节点其中一个是主剩下的都是从节点从节点的数据要从主节点这里同步过来这里的从节点也可能是其他从节点的主节点
3.6、中间件Middleware
相通业务的服务功能更通用的服务数据库、缓存、消息队列、负载均衡、安全认证、同步数据
3.7、可用性Availability
系统整体可用的时间/总的时间 一年能可用多长时间360/36598.63%
3.8、响应时长Response Time RT
衡量服务器的性能 和具体服务器要做的业务密切相关的 越小越好
3.9、吞吐Throughputvs并发Concurrent
吞吐指系统在单位时间内处理的请求数或者说单位时间内处理的字节数
并发则是指同时访问系统的用户数量
衡量系统的处理请求的能力衡量性能的一种方式
4、命令行客户端
4.1、连接redis
1交互式方式redis-cli -h 127.0.0.1 -p 6379
是否连接上ping一下响应PONG 2命令方式交互redis-cli -h 127.0.0.1 -p 6379 ping
当然后面命令不是就这一种只要是redis的命令就可以 注-h {host} -p {port}
4.1.1、全局命令
redis中5种常见数据结构他们都是键值对的形式对于键来说有些通用的命令
1KEYS满足样式pattern的key
命令操作 keys pattern 注这里keys *是全部都去查询的所以尽量不要使用大量的查询也会吃掉很多的网络带宽这时如果客户端来了信息就不一定能接收得到了
2EXISTS
判断某个key是否存在
操作命令EXISTS key (这里可以是多个redis1.0版本之后都是可以的)
返回的是查询的个数查到的有几个 3DEL 删除命令
删除命令del key 可以指定多个key 4EXPIRE 设定过期时间
指定这个key的过期时间秒级的过期时间
操作命令EXPIEX key 秒数
设置之前 这个key是需要存在的才能设置时间 TTL 是显示key当前还剩下多少时间如果是-1表示没有设置过期时间-2表示没有这个key 5TYPE 数据类型
操作命令TYPE key 4.2、String字符串
字符串类型是Redis最基础的数据类型关于字符串需要特别注意首先redis所有的键类型都是字符串类型而且其他几种数据结构也都是在字符串类似基础上构建的
4.2.1、创建键值对
操作命令set key value [expiration EX seconds | PX milliseconds] [NX|XX] expiration这个关键词已经介绍过了就是过期时间如果不设置时间的话就是以秒为单位的如果以PX 开头的话为就是毫秒级别的 EX seconds 使用秒为单位进行设置过期时间 PX milliseconds 使用毫秒为单位设置过期时间 NX 只在key不存在时才能设置如果存在key之前已经存在 设置不执行 XX 只在key存在时才进行设置既如果key之前不存在设置不执行 命令就直接拿来练set 是设置命令 get是获取key对应的value
127.0.0.1:6379 keys *
(empty array)
127.0.0.1:6379 EXISTS mykey
(integer) 0
127.0.0.1:6379 set mykey hello
OK
127.0.0.1:6379 get mykey
hello
127.0.0.1:6379 set mykey world NX
(nil)
127.0.0.1:6379 del mykey
(integer) 1
127.0.0.1:6379 set mykey world NX
OK
127.0.0.1:6379 get mykey
world
127.0.0.1:6379 get mykey
world
127.0.0.1:6379 set mykey will expire in 10s EX 10
OK
127.0.0.1:6379 ttl mykey
(integer) 6
127.0.0.1:6379 ttl mykey
(integer) 5
127.0.0.1:6379 get mykey
(nil)以上是一些演示环节友友们直接自行操作即可 最后的四行命令主要展示的是在设置键值对的时候就开始了设置过期时间
EX 这里演示意思是如果mykey值是有的但是我能给你覆盖掉并且设定一个过期时间
注redis进行命令操作的时候一般都是有提示的所以不用硬记命令
4.2.2、一次获取多个值
MGET命令操作mget key 这里可以写多个key 一次获取多个key的value
下面开始命令演示
127.0.0.1:6379 keys *
(empty array)
127.0.0.1:6379 set key1 hello
OK
127.0.0.1:6379 set key2 world
OK
127.0.0.1:6379 mget key1 key2 key3
1) hello
2) world
3) (nil)mget 获取不同个key的value值 会对应进行显示如果这个key值不存在的话就会直接打印一个nil
注nil就相当于C语言中的NULL 也就相当于 Java中的null 就是没有的意思
4.2.3、一次创建多个键值对
一次设置多个key 的值
MSET 操作命令MSET key value 设置多组key-value
127.0.0.1:6379 MSET key3 hello key4 world
OK
127.0.0.1:6379 MGET key3 key4
1) hello
2) worldmget/mset有效减少网络时间所以性能相较更高假设网络消耗1毫秒执行时间消耗0.1毫秒
例如1000次get 耗时1000*1 1000*0.11100毫秒 1次mget1000个 耗时 1*11000*0.1101毫秒
命令是向服务器发送请求的而不是当前直接执行命令命令交给服务器进行执行所以这里mset发送命令的时候发送1次消耗的时间减少了网络传输的时间网络传输的时间是比较慢的同时也是比较珍贵的资源
4.2.4、覆盖创建键值对
设置key-value 允许在key之前不存在的情况下
127.0.0.1:6379 SETNX mykey hello
(integer) 1
127.0.0.1:6379 SETNX mykey world
(integer) 0
127.0.0.1:6379 get mykey
helloSET、SETNX、SETXX其实一个set也就够用了后面两个完全不需要去记只要会set 相关的命令后面两个命令都很简单
4.3、计数命令
4.3.1、单增命令
key对应string表示的数字加一如果key不存在则视为key对应的value是0这里key可以是string类型创建的但是他必须是一个整型或者不超过64位符号整型
操作命令incr key 下面演示的是正常情况
返回值加1后的值
127.0.0.1:6379 set key5 1
OK
127.0.0.1:6379 EXISTS key5
(integer) 1
127.0.0.1:6379 INCR key5
(integer) 2
127.0.0.1:6379 get key5
2如果是非整型类型的数据
127.0.0.1:6379 get key2
world
127.0.0.1:6379 INCR key2
(error) ERR value is not an integer or out of range这里就拿string类型的来演示
4.3.2、n增命令
单增的情况是比较常见的但是一次增加一个数也不少见使用INCRBY命令操作
操作命令INCRBY key 数值
返回值加后的值
127.0.0.1:6379 EXISTS key5
(integer) 1
127.0.0.1:6379 get key5
2
127.0.0.1:6379 INCRBY key5 10
(integer) 12
127.0.0.1:6379 get key5
12注INCRBY命令返回的是一个数值进行加法后的数值同样如果不是一个整型也会报错的
4.3.3、单减命令
DECR就是key对应string表示的数字减一key不存在则key对应的value是0
返回值减1后的值
127.0.0.1:6379 get key5
12
127.0.0.1:6379
rootubuntu22:~# redis-cli
127.0.0.1:6379 EXISTS key5
(integer) 1
127.0.0.1:6379 get key5
12
127.0.0.1:6379 DECR key5
(integer) 11
127.0.0.1:6379 get key5
114.3.4、n减命令
DECRBY就是针对确定的数字进行减法的
操作命令DECRBY key 数值
返回值减后的值
127.0.0.1:6379 EXISTS key5
(integer) 1
127.0.0.1:6379 get key5
11
127.0.0.1:6379 DECRBY key5 10
(integer) 1
127.0.0.1:6379 get key5
14.3.5、浮点数加减
INCRBYFLOAT命令就是针对浮点小数的加减的
操作命令INCRBYFLOAT key 浮点数
返回值加减完后的值
127.0.0.1:6379 EXISTS key5
(integer) 1
127.0.0.1:6379 get key5
1
127.0.0.1:6379 INCRBYFLOAT key5 0.1
1.1
127.0.0.1:6379 get key5
1.1
127.0.0.1:6379 INCRBYFLOAT key5 -0.5
0.6
127.0.0.1:6379 get key5
0.6注INCRBYFLOAT后面跟值是正数就进行 “” 如果是负数 “-”
4.4、string获取相关命令
4.4.1、末尾追加命令
操作命令 APPEND key value
返回值追加后整个string的长度
127.0.0.1:6379 EXISTS key2
(integer) 1
127.0.0.1:6379 get key2
world
127.0.0.1:6379 APPEND key2 hello
(integer) 10
127.0.0.1:6379 get key2
worldhello4.4.2、获取string指定区间
操作命令GETRANGE key start end
127.0.0.1:6379 set mykey this is a people
OK
127.0.0.1:6379 GETRANGE mykey 0 4
this
127.0.0.1:6379 GETRANGE mykey -5 -1
eople
127.0.0.1:6379 GETRANGE mykey 0 -1
this is a peopleGETRANGE区间的选定的是比较类似于Python的可以支持负数这里0 到 -1 表示的就是到最后一个位置 -1 也表示当前字符串的最大长度该命令类似于子串的截取
4.4.3、子串的覆盖
操作命令SETRANGE key offset value
offset 就是偏移量 value就是string内容
返回值替换后string的长度
127.0.0.1:6379 set key1 Hello world xx
OK
127.0.0.1:6379 get key1
Hello world
127.0.0.1:6379 SETRANGE key1 6 redis
(integer) 11
127.0.0.1:6379 get key1
Hello redis注这里第一条命令使用了 xx 是因为我这里位置直接覆盖原来的内容方便演示前面对xx提到过。
4.4.4、获取string长度
操作命令STRLEN key
127.0.0.1:6379 get mykey
this is a people
127.0.0.1:6379 STRLEN mykey
(integer) 16
127.0.0.1:6379 STRLEN hello
(integer) 0注如果当前key值存在会打印出对应的key的长度如果不存在的话就直接返回0
4.4.5、内部编码
其实string针对不同长度和字符类型是有一个定区别的 字符串类型的内部编码有三种 int 8个字节的长整型如果是数值的字符串会以int的形式存在的内部会存储为二进制形式 embstr小于等于 39 个字节的字符串浮点小数也是数值都是可以设置所以这里只是提下 raw大于39个字节的字符串 查看类型操作命令object encoding key
127.0.0.1:6379 get key5
0.6
127.0.0.1:6379 object encoding key5
embstr
127.0.0.1:6379 set key6 1
OK
127.0.0.1:6379 object encoding key6
int
127.0.0.1:6379 set key7 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OK
127.0.0.1:6379 object encoding key7
raw4.5、Hash哈希
注Hash很多命令都和string命令很相似印象记忆即可
基本学习编程语言得都会接触到哈希redis也是一样都是以键值对的形式存在的
字符串和哈希进行对比 4.5.1、创建哈希键值对
操作命令HSET key field value 这里可以设置多组field value 最低版本2.0
返回值添加的字段的个数
127.0.0.1:6379 HSET myhash say1 hello
(integer) 1
127.0.0.1:6379 HGET myhash say1
hello4.5.2、删除键值对
操作命令HDEL key field field可以是多个
返回值本次操作删除的字段个数
127.0.0.1:6379 HSET myhash field1 world field2 world2
(integer) 2
127.0.0.1:6379 HEXISTS myhash field1
(integer) 1
127.0.0.1:6379 HDEL myhash field1
(integer) 1
127.0.0.1:6379 HKEYS myhash
1) say1
2) field2
注这里HEXISTS就是看一下哈希键中存不存在值存在就可以进行删除了使用类似于StringKEYS命令就可以进行查看hash采用HKEYS
4.5.3、获取hash中所有值
操作命令HVALS key
返回值所有值
127.0.0.1:6379 HVALS myhash
1) hello
2) world24.5.4、获取所有字段和对应值
操作命令HGETALL key
返回值所有字段和对应值
127.0.0.1:6379 HSET myhash field hello
(integer) 1
127.0.0.1:6379 HSET myhash field1 world
(integer) 1
127.0.0.1:6379 HGETALL myhash
1) field
2) hello
3) field1
4) world注这里的返回值奇数位是field 偶数位是 value 上下对应的
4.5.5、一次获取hash多个字段值
操作命令HMGET key field 可以获取多个field对应的值
返回值字段对应值或者是nil
127.0.0.1:6379 hset myhash field2 hello field3 world
(integer) 2
127.0.0.1:6379 HMGET myhash field2 field3 say
1) hello
2) world
3) (nil)注我这里会时不时删除myhash中的field为了方便演示
4.5.6、hash所有字段的个数
操作命令HLEN key
返回值字段个数
127.0.0.1:6379 HSET myhash field4 xiaoxu
(integer) 1
127.0.0.1:6379 HSET myhash field5 xiaoli
(integer) 1
127.0.0.1:6379 HKEYS myhash
1) field2
2) field3
3) field4
4) field5
127.0.0.1:6379 HLEN myhash
(integer) 4注这里给友友们提供了常见命令例如剩下的HSETNX、HINCRBY、HINCRBYFLOAT等命令可以自己去官网上看看了解一下
4.5.7、内部编码
哈希的内部编码有两种 ziplist压缩链表配置文件会有这两个值hash-max-ziplist-entries 512、hash-max-ziplist-value 64是作为限制的都是可以配置数字是可以进行更改的当哈希类型元素个数小于hash-max-ziplist-entries 配置512 同时所有值都小于hash-max-ziplist-value配置 64redis会将ziplist作为哈希内部实现如果不能满足就会使用hastable前者比较省内存 hashtable哈希表当哈希类是无法满足ziplist的时候redsi就会使用hashtable作为哈希的内部实现为了读写效率hashtable此时的读写效率仍旧是O1 127.0.0.1:6379 HMSET hashkey f1 v1 f2 v2
OK
127.0.0.1:6379 object encoding hashkey
ziplist
127.0.0.1:6379 hset hashkey f3 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 1
127.0.0.1:6379 object encoding hashkey
hashtable注这里只演示了如果值字节大小超过了64会变成hashtable512就不演示了这里友友们可押进行尝试一下可以进行修改后再去尝试毕竟512实在是太多了
4.6、List列表
列表类型是用来存储多个有序的字符串Redis中可以列表的两端进行插入和弹出还可以获取指定范围的元素列表、获取指定索引下标饿元素等列表是一种的比较灵活的数据结构它可以充当栈和队列的角色
左端和右端可进可出灵活性高可以适合很多的应用场景在于自己构造
注列表允许存在重复元素
4.6.1、左侧插入
操作命令LPUSH key element 多个元素
返回值插入后list的长度
127.0.0.1:6379 LPUSH mylist world
(integer) 1
127.0.0.1:6379 LPUSH mylist hello
(integer) 2
127.0.0.1:6379 LRANGE mylist 0 -1
1) hello
2) world注返回值显示的list的长度不是内容长度 左侧插入第一个是world 第二次插入一个hellohello插入在world左侧所以显示出来就是先hello 后 world
4.6.2、右侧插入
操作命令RPUSH
将一个或者多个元素从的右侧放入到list中
返回值插入后list的长度
127.0.0.1:6379 RPUSH mylist world
(integer) 1
127.0.0.1:6379 RPUSH mylist hello
(integer) 2
127.0.0.1:6379 LRANGE mylist 0 -1
1) world
2) hello注打印出来的刚好是与LPUSH显示相反的
4.6.3、显示所有的list列表
操作命令LARANGE key
返回值key中所有的值
4.6.4、左侧抛出元素
操作命令LPOP key
返回值抛出元素打印
127.0.0.1:6379 RPUSH mylist one two three four five
(integer) 5
127.0.0.1:6379 LPOP mylist
one
127.0.0.1:6379 LPOP mylist
two
127.0.0.1:6379 LPOP mylist
three
127.0.0.1:6379 LRANGE mylist 0 -1
1) four
2) five注这里采用右侧插入左侧抛出相当于是队列
4.6.5、右侧抛出元素
操作命令RPOP key
返回值取出的元素或者nil
127.0.0.1:6379 RPUSH mylist one two three four five
(integer) 5
127.0.0.1:6379 RPOP mylist
five
127.0.0.1:6379 LRANGE mylist 0 -1
1) one
2) two
3) three
4) four注这里是右侧输出
4.6.6、获取index位置元素
操作命令LINDEX key index
返回值取出的元素或者nil
127.0.0.1:6379 LPUSH mylist world
(integer) 1
127.0.0.1:6379 LPUSH mylist hello
(integer) 2
127.0.0.1:6379 LINDEX mylist 0
hello
127.0.0.1:6379 LINDEX mylist 1
world
127.0.0.1:6379 LINDEX mylist -1
world
127.0.0.1:6379 LINDEX mylist 10
(nil)注redis是支持负数的访问相当于是倒序访问如果不存在的话访问结果为nil
4.6.7、特定位置插入元素
操作命令LINSERT key BEFORE | AFTER pivot element
BEFORE在指定元素之前插入
AFTER在指定元素之后插入
pivot指定的元素
element新的元素
注大部分参数都是英文翻译过来就能理解这里也是一样的
返回值插入后的list长度
127.0.0.1:6379 RPUSH mylist hello
(integer) 1
127.0.0.1:6379 RPUSH mylist world
(integer) 2
127.0.0.1:6379 LINSERT mylist BEFORE world There
(integer) 3
127.0.0.1:6379 LRANGE mylist 0 -1
1) hello
2) There
3) world4.6.8、扩展命令
1LLEN是计算这个list的元素个数的也就是长度
2阻塞相关命令BLPOP、BRPOP这两个阻塞命令友友们可以去看看redis官网可以使用redis作为一个阻塞队列当然消息队列是有其他更合的中间件
4.6.9、内部编码
list的内部编码也有两种ziplist压缩列表linkedlist链表针对redis 3.2以下的版本 ziplist压缩列表列表的元素个数⼩于list-max-ziplist-entries配置默认512个同时 列表中每个元素的⻓度都⼩于list-max-ziplist-value配置默认64字节时Redis会选⽤ ziplist来作为列表的内部编码实现来减少内存消耗 注不要记数值 数值是可以自行配置的 LinkedList链表当列表类无法满足ziplist的时候redis会使用linkedlist作为list列表实现 127.0.0.1:6379 RPUSH mylist hello
(integer) 1
127.0.0.1:6379 OBJECT encoding mylist
ziplist
127.0.0.1:6379 RPUSH mylist aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 2
127.0.0.1:6379 OBJECT encoding mylist
linkedlistquicklist快速列表是针对redis3.2以上的版本综合了前面两种数据结构
127.0.0.1:6379 RPUSH mylist hello
(integer) 1
127.0.0.1:6379 OBJECT encoding mylist
quicklist4.7、Set集合
集合类型也是保存多个字符串类型的元素的但和列表类型不同的是集合中1元素之间是⽆序 的2元素不允许重复Redis除了⽀持集合内的增删查改操作同时还⽀持多个集合取交集、并集、差集合理地使⽤好集合类型
4.7.1、添加元素
操作命令SADD key member 可以有多个元素
返回值本次添加的元素个数
127.0.0.1:6379 SADD myset hello
(integer) 1
127.0.0.1:6379 SADD myset world
(integer) 1
127.0.0.1:6379 SADD myset world
(integer) 0
127.0.0.1:6379 SMEMBERS myset
1) hello
2) world注这里不难看出world在同一个键中存了两次第二次存的时候返回值是0表示失败
SMEMBERS打印指定key的所有值这个显示是无序的
4.7.2、判断key是否存在
操作命令SISMEMBER key member
返回值1表示元素存在0表示元素不存在
127.0.0.1:6379 SADD myset one
(integer) 1
127.0.0.1:6379 SADD myset two
(integer) 1
127.0.0.1:6379 SISMEMBER myset two
(integer) 1
127.0.0.1:6379 SISMEMBER myset three
(integer) 04.7.3、获取集合内的个数
操作命令SCARD key
返回值set内的元素个数
127.0.0.1:6379 SCARD myset
(integer) 24.7.4、随机元素
注这里的删除是随机删除有set内的元素是无序的 时间复杂度O(1)
返回值取出的元素
127.0.0.1:6379 SADD myset one
(integer) 1
127.0.0.1:6379 SADD myset two
(integer) 1
127.0.0.1:6379 SADD myset three
(integer) 1
127.0.0.1:6379 SPOP myset
two
127.0.0.1:6379 SMEMBERS myset
1) one
2) three
127.0.0.1:6379 SADD myset four
(integer) 1
127.0.0.1:6379 SADD myset five
(integer) 1
127.0.0.1:6379 SPOP myset 3
1) one
2) five
3) three
127.0.0.1:6379 SMEMBERS myset
1) four注如果是全部照敲的话大概率应该是跟我不一样的SPOP是随机抛出的
4.7.5、指定元素删除
时间复杂度O(N)
操作命令SREM key member 可以设置多个
127.0.0.1:6379 SADD myset one
(integer) 1
127.0.0.1:6379 SADD myset two
(integer) 1
127.0.0.1:6379 SADD myset thre
(integer) 1
127.0.0.1:6379 SREM myset thre
(integer) 1
127.0.0.1:6379 SMEMBERS myset
1) one
2) two注这里就是说删谁就删谁但是会消耗掉时间所以时间复杂度相较于随机删除就慢一点
4.7.6、移动元素
注从一个键中移到另外一个键里
操作命令SMOVE source destination member
source原键
destination目标键
member原键的值
返回值1表示移动成功0表示移动失败
127.0.0.1:6379 SADD myset one
(integer) 1
127.0.0.1:6379 SADD myset two
(integer) 1
127.0.0.1:6379 SADD myotherset three
(integer) 1
127.0.0.1:6379 SMOVE myset myotherset two
(integer) 1
127.0.0.1:6379 SMEMBERS myset
1) one
127.0.0.1:6379 SMEMBERS myotherset
1) two
2) three注 关键代码翻译 从myset移动到myotherset的值为two
4.7.7、内部编码
集合类型的内部编码有两种 intset整数集合当集合中的元素都是整数并且元素的个数⼩于set-max-intset-entries配置 默认512个时Redis会选⽤intset来作为集合的内部实现从⽽减少内存的使⽤这个值是可以设置的 hashtable哈希表当集合类型⽆法满⾜intset的条件时Redis会使⽤hashtable作为集合的内部实现 127.0.0.1:6379 SADD setkey 1 2 3
(integer) 3
127.0.0.1:6379 object encoding setkey
intset
127.0.0.1:6379 SADD setkey 4 5
(integer) 2
127.0.0.1:6379 object encoding setkey
hashtable
127.0.0.1:6379 SCARD setkey
(integer) 5注这里是因为我修改了配置文件set-max-intset-entries 个数为4关闭redis后重启就可以了这里是为了给友友们展示知道即可不需要这样
4.8、Zset有序集合
有序集合中的元素是不能重复的但分数允许重复。类⽐于⼀次考试之后每个⼈⼀定有⼀ 个唯⼀的分数但分数允许相同
注下面会很长用到一个查询命令ZRANGE key start end 和前面基本很相似
4.8.1、添加元素
操作命令ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member可以多个]
别看参数多这里只介绍常用的 XX仅仅添加更新已经存在的元素不会添加新元素 NX仅哟弄过于添加新元素不会更新已经存在的元素 CH默认情况ZADD返回的是是本次添加元素个数但指定这个选项之后就会还包含本次更新的元素个数 INCR此时命令类似ZINCRBY的效果将元素的分数加上指定的分数此时只能指定一个元素和分数 score 表示的是一个分数zset就是根据这个分数进行排序的
member是元素每个元素都带有一个分数
下面我我就会就开始挨个看 [] 括号内的是可以不写的可以省略的
127.0.0.1:6379 ZADD myzset 1 one
(integer) 1
127.0.0.1:6379 ZADD myzset 1 uno
(integer) 1
127.0.0.1:6379 ZADD myzset 2 two 3 three
(integer) 2
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores
1) one
2) 1
3) uno
4) 1
5) two
6) 2
7) three
8) 3
127.0.0.1:6379 ZADD myzset 10 one 20 two 30 three
(integer) 0
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores
1) uno
2) 1
3) one
4) 10
5) two
6) 20
7) three
8) 30注这里是基本的命令还有就是针对zset不可重复进行展示设置过的键值不加特殊处理是不能进行修改的
演示CH 、XX 参数选项
127.0.0.1:6379 ZADD myzset CH 100 one 200 two 300 three
(integer) 3
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores
1) uno
2) 1
3) one
4) 100
5) two
6) 200
7) three
8) 300
127.0.0.1:6379 ZADD myzset XX 99 one 200 two 300 three
(integer) 0
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores
1) uno
2) 1
3) one
4) 99
5) two
6) 200
7) three
8) 300注XX是不能添加新元素的因为添加不进去
NX只能添加新元素半不能更改元素内容
127.0.0.1:6379 ZADD myzset NX 100 one 200 two 300 three 400 four 500 five
(integer) 2
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores1) uno2) 13) one4) 995) two6) 2007) three8) 3009) four
10) 400
11) five
12) 500注注意细节one还是99 并没有改为100因为NX只能负责添加新元素已有的保持不变
INCR进行元素添加添加添加分数 对应的键
127.0.0.1:6379 ZADD myzset incr 10 one
109
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores1) uno2) 13) one4) 1095) two6) 2007) three8) 3009) four
10) 400
11) five
12) 500注这里是添加给one这里就会看到one是对应分数109
给友友们看一下无限大和无限小
127.0.0.1:6379 ZADD myzset -inf first inf last
(integer) 2
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores1) first2) -inf3) uno4) 15) one6) 1097) two8) 2009) three
10) 300
11) four
12) 400
13) five
14) 500
15) last
16) inf4.8.2、获取一个zset的个数
操作命令ZCARD key
返回值zset内的元素
127.0.0.1:6379 ZCARD myzset
(integer) 84.8.3、取指定分数区间
操作命令ZCOUNT key min max
返回值满足条件的元素列表个数
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores1) first2) -inf3) uno4) 15) one6) 1097) two8) 2009) three
10) 300
11) four
12) 400
13) five
14) 500
15) last
16) inf
127.0.0.1:6379 ZCOUNT myzset 50 400
(integer) 4注redis采用的是左闭右闭的结构所以这里包括400在内的都会被算进去
4.8.4、按照降序进行排列
操作命令ZREVRANGE key start stop [withscores]
返回值区间内的所有元素
127.0.0.1:6379 ZRANGE myzset 0 -1 withscores1) first2) -inf3) uno4) 15) one6) 1097) two8) 2009) three
10) 300
11) four
12) 400
13) five
14) 500
15) last
16) inf
127.0.0.1:6379 ZREVRANGE myzset 0 -1 withscores1) last2) inf3) five4) 5005) four6) 4007) three8) 3009) two
10) 200
11) one
12) 109
13) uno
14) 1
15) first
16) -inf注这里只是降序打印
4.8.5、只返回元素列表
操作命令ZRANGEBYSCORE key min max
返回值 区间内的元素列表
127.0.0.1:6379 ZRANGEBYSCORE myzset -inf inf
1) first
2) uno
3) one
4) two
5) three
6) four
7) five
8) last4.8.6、内部编码
有序集合类型的内部编码有两种 ziplist压缩列表当有序集合的元素个数小于zset-max-ziplist-entries配置 默认128同时每个元素的值都小于zset-max-ziplist-value配置默认 64redis会用ziplist来作为有序集合的内部实现ziplist可以有效减少内存的使用 skiplist跳表当ziplist条件不满足时有序集合会使用skiplist作为内部实现因为此时ziplist效率会下降 127.0.0.1:6379 zadd myzset 100 one 200 two 300 three
(integer) 3
127.0.0.1:6379 object encoding myzset
ziplist
127.0.0.1:6379 zadd myzset 400 four 500 five
(integer) 2
127.0.0.1:6379 object encoding myzset
skiplist注这里我们修改了配置文件为了方便显示友友知道即可ZSET命令还有很多友友们可以去官网看看