REDIS01_概述安装key字符串String列表List集合SetHash哈希Zset有序集合配置文件详解
Posted TZ845195485
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了REDIS01_概述安装key字符串String列表List集合SetHash哈希Zset有序集合配置文件详解相关的知识,希望对你有一定的参考价值。
文章目录
①. Redis的概述
-
①. redis是一款高性能的开源NOSQL系列的非关系型数据库,Redis是用C语言开发的一个开源的高键值对(key value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前Redis支持的键值数据类型如下:(字符串类型String、哈希类型hash、列表类型list、集合类型set、有序集合类型sortedset)
-
②. 缓存思想:从缓存中获取数据
有数据,直接返回
没有数据,从数据库查询,将数据放入缓存,返回数据 -
③. 使用场景
- 高频次,热门访问的数据,降低数据库IO
- 分布式架构,做session共享
- 多样的数据结构存储持久化数据
-
④. Redis默认端口6379的由来(Alessia Merz)
-
⑤. 默认16个数据库,类似数组下标从0开始,初始默认使用0号库
使用命令 select dbid来切换数据库。如: select 8
统一密码管理,所有库同样密码。
dbsize查看当前数据库的key的数量
flushdb清空当前库
flushall通杀全部库
②. Redis6的安装
-
①. Redis6.0.9安装
-
③. linux下Redis的目录信息
- redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
- redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
- redis-check-dump:修复有问题的dump.rdb文件
- redis-sentinel:Redis集群使用
- redis-server:Redis服务器启动命令
- redis-cli:客户端,操作入口
- ④. 由于我们的服务器在青牛云上,对端口进行了映射处理,这里的redis的端口也在配置文件中修改成了9736,我们在进入redis客户端的时候要使用redis-cli -p 9736
③. 常用五大数据类型
①. Redis键(key)
命令 | 解释 |
---|---|
keys * | 查看当前库所有key (匹配:keys *1) |
exists key | 判断某个key是否存在 |
type key | 查看你的key是什么类型 |
exists key | 判断某个key是否存在 |
del key | 根据value选择非阻塞删除 |
unlink key | 判断某个key是否存在 |
仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作 | |
expire key 10 | 10秒钟:为给定的key设置过期时间 |
ttl key | 查看还有多少秒过期,-1表示永不过期,-2表示已过期 |
select | 命令切换数据库 |
dbsize | 查看当前数据库的key的数量 |
flushdb | 清空当前库 |
flushall | 通杀全部库 |
②. 字符串类型 String
-
①. String是Redis最基本的类型,一个key对应一个value。
-
②. String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
-
③. String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList -
④. 存储( set key value) 获取(get key) 删除(del key)
127.0.0.1:9736> keys *
(empty array)
127.0.0.1:9736> set name TANGZHI
OK
127.0.0.1:9736> get name
"TANGZHI"
127.0.0.1:9736> del name
(integer) 1
127.0.0.1:9736> get name
(nil)
- ⑤. 其他关于String的操作指令
指令 | 解释 |
---|---|
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中储存的数字值增减。自定义步长 |
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所储存的字符串值,从起始位置开始(索引从0开始)。 |
setex key 过期时间 value | 设置键值的同时,设置过期时间,单位秒 |
getset key value | 以新换旧,设置了新值同时获得旧值 |
127.0.0.1:9736> set age 24
OK
127.0.0.1:9736> incr age
(integer) 25
127.0.0.1:9736> get age
"25"
127.0.0.1:9736> decr age
(integer) 24
127.0.0.1:9736> get age
"24"
127.0.0.1:9736> incrby age 10
(integer) 34
127.0.0.1:9736> decrby age 10
(integer) 24
127.0.0.1:9736> get age
"24"
③. 列表 list
-
①. 列表list是一个单键多值的
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
-
②. 常用命令 插入、删除、获取
指令 | 解释 |
---|---|
lpush key value | 将元素加入列表左边 |
rpush key value | 将元素加入列表右边 |
lpop key | 删除列表最左边的元素,并将元素返回 |
rpop key | 删除列表最右边的元素,并将元素返回 |
lrang key start end(0 -1) | 按照索引下标获得元素(从左到右) |
-1右边第一个,(0-1表示获取所有) | |
rpoplpush key1 key2 | 从key1列表右边吐出一个值,插到key2列表左边 |
lindex key index | 按照索引下标获得元素(从左到右) |
llen key | 获得列表长度 |
127.0.0.1:9736> lpush mylist a
(integer) 1
127.0.0.1:9736> lpush mylist b
(integer) 2
127.0.0.1:9736> lpush mylist c
(integer) 3
127.0.0.1:9736> rpush mylist d
(integer) 4
127.0.0.1:9736> rpush mylist e
(integer) 5
127.0.0.1:9736> rpush mylist f
(integer) 6
127.0.0.1:9736> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"
6) "f"
127.0.0.1:9736> rpop mylist
"f"
127.0.0.1:9736> lrange mylist 0 -1
1) "b"
2) "a"
3) "d"
4) "e"
127.0.0.1:9736>
- ③. List的数据结构为快速链表quickList
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存
当数据量比较多的时候才会改成quicklist
④. 集合 Set
-
①. set是可以自动排重的,不允许元素重复
Set数据结构是dict字典,字典是用哈希表实现的 -
②. 常用命令
指令 | 解释 |
---|---|
sadd key value1 value2 | 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略 |
smembers key | 取出该集合的所有值 |
srem key value1 value2 … | 删除集合中的某个元素 |
sismember keyvalue | 判断集合key是否为含有该value值,有1,没有0 |
scard key | 返回该集合的元素个数 |
spop key | 随机从该集合中吐出一个值 |
srandmember key n | 随机从该集合中取出n个值。不会从集合中删除 |
smove source destination value | 把集合中一个值从一个集合移动到另一个集合 |
sinter key1 key2 | 返回两个集合的交集元素 |
sunion key1 key2 | 返回两个集合的并集元素 |
sdiff key1 key2 | 返回两个集合的差集元素(key1中的,不包含key2中的) |
127.0.0.1:9736> sadd myset a
(integer) 1
127.0.0.1:9736> sadd myset a
(integer) 0
127.0.0.1:9736> smembers myset
1) "a"
127.0.0.1:9736> srem myset a
(integer) 1
127.0.0.1:9736> smembers myset
(empty array)
127.0.0.1:9736> keys *
(empty array)
127.0.0.1:9736>
⑤. 哈希 hash
-
①. Hash类型对应的数据结构是两种: ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable (Map<String,Map<Object,Obje ct>>)
-
②. 常用命令
指令 | 解释 |
---|---|
HSET key field value | 一次设置一个字段值 |
HGET key field | 一次获取一个字段值 |
hgetall key | 获取所有字段值 |
hdel | 删除一个key |
HMSET key field value [field value …] | 一次设置多个字段值 |
HMGET key field [field …] | 一次获取多个字段值 |
hlen | 获取某个key内的全部数量 |
hkeys key | 列出该hash集合的所有field |
hvals key | 列出该hash集合的所有value |
hincrby key field increment | 为哈希表 key 中的域field的值加上增量 1 -1 |
hsetnx key field value | 将哈希表 key 中的域field的值设置为value,当且仅当域field不存在 |
127.0.0.1:9736> hset myUser username TANGZHI
(integer) 1
127.0.0.1:9736> hset myUser password 123456
(integer) 1
127.0.0.1:9736> hget myUser username
"TANGZHI"
127.0.0.1:9736> hget myUser password
"123456"
127.0.0.1:9736> hgetall myUser
1) "username"
2) "TANGZHI"
3) "password"
4) "123456"
127.0.0.1:9736> hdel myUser username
(integer) 1
127.0.0.1:9736> hgetall myUser
1) "password"
2) "123456"
127.0.0.1:9736>
⑥. 有序集合 Zset
-
①.Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了
-
②. 常用命令
指令 | 解释 |
---|---|
zadd key score1 value1 score2 value2… | 将一个或多个member元素及其score值加入到有序集key当中 |
zrange key start stop[WITHSCORES] | 返回有序集key中,下标在startstop之间的元素 |
带WITHSCORES,可以让分数一起和值返回到结果集 | |
zrem key value | 删除该集合下,指定值的元素 |
zrangebyscore key min max[withscores][limitoffsetcount] | 返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。有序集成员按score值递增(从小到大)次序排列 |
zrevrangebyscore key max min[withscores][limitoffsetcount] | 同上,改为从大到小排列 |
zincrby key increment value | 为元素的score加上增量 |
zcount key min max | 统计该集合,分数区间内的元素个数 |
zrank key value | 返回该值在集合中的排名,从0开始 |
127.0.0.1:9736> zadd myzset 1 mysql
(integer) 1
127.0.0.1:9736> zadd myzset 2 redis
(integer) 1
127.0.0.1:9736> zadd myzset 3 java
(integer) 1
127.0.0.1:9736> zadd myzset 3 spring
(integer) 1
127.0.0.1:9736> zrange myzset 0 -1
1) "mysql"
2) "redis"
3) "java"
4) "spring"
127.0.0.1:9736> zrem myzset spring
(integer) 1
127.0.0.1:9736> zrange myzset 0 -1
1) "mysql"
2) "redis"
3) "java"
127.0.0.1:9736>
- ③. 如何利用zset实现一个文章访问量的排行榜?
127.0.0.1:9736> zrange tops 0 -1 withscores
1) "java"
2) "100"
3) "mysql"
4) "200"
127.0.0.1:9736> zrevrangebyscore tops 300 100
1) "mysql"
2) "java"
127.0.0.1:9736> zrevrange tops 0 -1
1) "mysql"
2) "java"
④. 配置文件详解
- ①. 计量单位说明
大小写不敏感
- ②. 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 是否为后台进程
-
⑧. log level
- 四个级别根据使用阶段来选择,生产环境选择notice或者warning
- 级别越高,查询出来的信息越少
-
⑨. database:设定库的数量默认16
-
⑩. requirepass 设置密码
# requirepass 123456
-
⑩①. maxclient 最大客户端连接数
-
⑩②. maxmemory
设置Redis可以使用的内存量。一旦到达内存使用上限,Redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。如果Redis无法根据移除规则来移除内存中的数据,或者设置了"不允许移除",那么Redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等 -
⑩③. Maxmemory-policy
- volatile-lru:使用LRU(最近最少使用)算法移除key,只对设置了过期时间的键
- allkeys-lru:使用LRU算法移除key
- volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
- allkeys-random:移除随机的key
- volatile-ttl(即将过期)移除那些TTL值最小的key,即那些最近要过期的key
- noeviction:不进行移除。针对写操作,只是返回错误信息
- ⑩④. Maxmemory-samples
- 设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小
- 一般设置3到7的数字,数值越小样本越不准确,但是性能消耗也越小
以上是关于REDIS01_概述安装key字符串String列表List集合SetHash哈希Zset有序集合配置文件详解的主要内容,如果未能解决你的问题,请参考以下文章
REDIS03_概述安装key字符串String列表List集合SetHash哈希Zset有序集合
REDIS03_概述安装key字符串String列表List集合SetHash哈希Zset有序集合持久化策略