Redis数据类型和常用配置

Redis数据类型和常用配置https://blog.csdn.net/projectNo/article/details/119733596
Redis发布订阅和事务https://blog.csdn.net/projectNo/article/details/119818581
Redis持久化https://blog.csdn.net/projectNo/article/details/119861861
Redis主从复制和哨兵模式https://blog.csdn.net/projectNo/article/details/119861873
Redis集群https://blog.csdn.net/projectNo/article/details/119893021

Redis

Redis 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。

NoSQL

NoSQL Not Only SQL 意为“不仅仅是数据库”,泛指非关系数据库。NoSQL不依赖业务逻辑的方式存储,而以简单的key-value模式存储。因此大大增加了数据库的扩展能力。

1、 特点:

  • 不遵循SQL标准
  • 不支持ACID
  • 性能远超SQL

2、适用场景:

  • 对数据高并发的读写
  • 海量数据的读写
  • 对数据的高可用性

3、不适用场景

  • 需要事务支持
  • 数据关系处理复杂

redis数据类型

key操作

1、常用命令

操作命令备注
查看当前库所有keykeys *无key返回(empty list or set),有key返回key列表
判断key是否存在exists key存在返回1;不存在返回0
查看key类型type key
删除指定的keydel key
根据value选择非阻塞删除unlink key仅将keys从keyspace元数据中删除,删除会在后续异步操作
给存在的key设置过期时间expire key time单位:秒,如果过期则获取不到
查看key的过期时间ttl key返回过期时间,单位:秒,-1永不过期;-2已过期
切换库select indexRedis默认有16个数据库,默认使用第一个
查看当前数据库key的数量dbsize
清空当前库flushdb慎用
清空所有库flushall慎用

字符串(String)

1、简介

String是Redis中最基本的类型,它是二进制安全的,String的value中最多可以存储512M。

2、常用命令

操作命令备注
添加键值对set key value返回OK成功
查询对应键值get key存在返回value;不存在返回(nil)
给value的值末尾追加append key value如果key存在,返回追加后的长度;如果key不存在,新建一个键值对
获取值的长度strlen keykey存在返回长度;不存在返回0
key不存在时设置key的值setnx key valuekey存在返回0不设值;不存在返回1设值
key中存储的数字值加减1incr/decr key值不是数字报错;是数字返回值
key中存储的数字值加减nincrby / decrby key n值不是数字报错;是数字返回值
同时设置一个或多个键值对mset key1 value1 key2 value2…
同时获取一个或多个键值对mget key1 key2…
同时设置一个或多个键值对msetnx key1 value1 key2 value2…仅当所有key不存在时才成功
截取valuegetrange key start stop类似于Java中的substring,包含start和stop,不会改变value的值
替换value固定位置的值setrange key start value例如set name ProjectNo,setrange name 0 WG,打印WGrojectNo
设置建值的同时,设置过期时间setex key 过期时间 value单位:秒
设置新值,返回旧值getset key valuekey不存在返回(nil)

3、数据结构

String的数据结构为简单动态字符串(Simple Dynamic String),是可以修改的字符串,类似于Java中的ArrayList,采用分配冗余空间的方式来减少内存的频繁分配。当字符串长度(len)高于实际分配空间(capacity)会自动扩容1M,注意字符串最大长度512M。

列表(List)

1、简介

单键多值,Redis列表是简单地字符串列表,按照插入顺序排序,可以添加元素到列表的头部或者尾部。它的底层是双向链表,对两端的操作性能很高,通过索引下标操作中间节点性能较差。

2、常用命令

操作命令备注
从左边或者右边插入一个或多个值lpush/rpush key value1 value2…
从左边或者右边吐出一个值,所有值吐出建消亡lpop/rpop key吐值会改变列表
从key1列表右边吐出一个值,插入到key2列表左边rpoplpush key1 key2
按照索引下标获取元素lrange key start stopl0左边第一个,-1右边第一个, 0 -1 表示获取全部
按照索引下标获取元素,从左到右lindex key index
获取列表长度llen key
在value的前面或后面插入newvalue的值linsert key before/after value newvalue
从左边删除n个值等于value的元素lrem key n value
将列表key下标为index的值替换为valuelset key index value

3、数据结构

List的数据结构为quickList,在元素较少的时候使用的是一块连续的内存,这个结构是压缩列表(zipList),它将所有的元素紧挨在一起存储,分配内存是连续的。当数据量较大时将链表和zipList结合起来组成了quickList,这样既满足了快速插入删除的性能,又不会出现太大的冗余空间。

集合(Set)

1、简介

set的功能与list类似,特殊之处是set自动去重,并且set可以判断收个值是否在集合中。

set是string类型的无序集合。他底层是一个value为null的hash表,所以添加、删除和查找的复杂度都是O(1)。

2、常用命令

操作命令备注
将一个或多个member元素加入到集合key中sadd key value1 value2…已存在的member元素会被忽略
获取除集合所有的值smembers key
判断集合key是否含有value值sismember key value有返回1;没有返回0
返回集合元素的个数scard key
删除集合中的一个或多个元素srem key value1 value2…
从集合随机吐出一个元素值spop key吐出之后从集合删除该元素
随机从集合吐出n个值srandmember key n不会从集合中删除元素
把集合中的一个值移到另一个集合smove key1 key2 valuevalue在key2中存在则不插入
返回两个集合的交集sinter key1 key2返回两个集合中都有的元素
返回两个集合的并集sunion key1 key2返回两个集合的所有元素并去重
返回两个集合的差集sdiff key1 key2返回key1中有key2中没有的元素

3、数据结构

Set的数据结构式dict字典,字典使用hashtable实现的,所有的value指向同一个内部值。

哈希(Hash)

1、简介

hash是一个string类型的field和value的映射表,hash特别适合存储对象,类似于Java中的Map<String,Object>。

2、 常用命令

操作命令备注
给key中的field建赋值valuehset key field value
获取key的field的valuehget key field
批量设置hash表的值hmset key field1 value1 field2 value2…
查看key中,是否存在fieldhexists key field1存在;0不存在
获取key中所有fieldhkeys key
获取key中所有valuehvals key
给key中的field的值加nhincrby key field nn可以为负数
给hey中的field的值设置为valuehsernx key field valuefield不存在时才能成功,1成功;0失败

3、数据结构

Hash类型对应的数据结构有两种:当field-value的长度较短且个数较少时使用zipList,否则使用hashtable。

有序集合(Zset)

1、简介

有序集合zset有普通的集合set非常相似,是一个没有重复的字符串的集合。不同之处是有序集合的每个成员都关联了一个评分(score),会用评分的值由低到高排序存储,集合成员是唯一的,但是评分可以重复。由于元素是有序的,所以获取次序和范围获取很快。有序集合一般用作一个没有重复成员的智能列表。

2、常用命令

操作命令备注
将一个或者多个member元素及其 score 值加入到有序集 key 当中zadd key score1 value1 score2 value2…
返回有序集合key中,下标在start和stop之间的元素zrange key start stop [withscores]withscores让分数和值一起返回
返回有序集合key所有score介于min和max之间的元素zrangebyscore key min max [withscroes] [limit offset count]包含min和max,返回结果用score增序,limit用法类似于MySQL用法
同上操作,返回结果顺序改为从大到小zrevrangebyscore key max min [withscroes] [limit offset count]
为元素的score加nzincrby key n valuen可以是负数
删除集合指定元素zrem key value
返回value在集合中的增序排名zrank key value
统计集合分数区间内的元素个数zcount key min max包含min和max

3、数据结构

有序集合(SortedSet Zset)他的数据结构类似于Java中的Map<String,Double>,他给每一个元素赋予一个权重score;它又类似于TreeSet,内部的元素会按照score进行排序,可以获取每个元素的名次,也可以通过score的范围查找。

Zset底层使用了两个数据结构:

  • hash,作用是个脸元素value和权重score,保障value的唯一性。
  • 跳跃表,目的在于给元素排序。

4、跳跃表

有序集合比较常见,比如热点排名或成绩排名等。有序集合的实现可以使数组、平衡树或链表等。数组不便插入和删除元素;平衡树或者红黑树虽然效率高但是结构复杂;链表查询遍历所有效率低。所有Redis采用的是跳跃表。

跳跃表是多条链表组成,最底层链表存放的是所有的score,上一层随机抽取一部分,再上一层以此类推。开始查找的时候从最上层对比,如果查找的值在两个值之间,就去下一层找,直到找到为止。这个算法很简单,效率却堪比红黑树。

Bitmaps

1、简介

bitmaps本身不是一种数据类型,实际上它是字符串,但是它可以对字符串的位进行操作。

bitmaps单独提供了一套操作命令,所以他和String的方法不太相同,可以想象成为一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在bitmaps中叫做偏移量。

2、常用命令

操作命令备注
设置Bitmaps中某个偏移量的值setbit key offset valuevalue只能是0和1
获取某个偏移量的值getbit key offset获取到的只有0和1
获取key的区间内偏移量值为1的个数bitcount key [start end]
复合操作bitop operation destkey [key …]operation:and交集、or并集、not非集和xor异域,操作结果保存到destkey 中

3、bitmaps于set对比

当统计基数大,统计的数据也大的时候,数据量非常大bitmaps的内存占用极小;当统计基数大,统计的数据较少的时候,bitmaps反而会占用内存大,所以要根据实际情况去选择使用哪个。

HyperLogLog

1、简介

HyperLogLog是用来统计基数的,也就是一个数据集中不重复的数据有多少个,性对于其他数据类型HyperLogLog处理大数据的时候占用内存极小,12KB的内存就可以计算将近2^64个不同的元素的基数。

2、常用命令

操作命令备注
添加指定元素到HyperLogLog中pfadd key [element…]
获取一个key的基数或多个key的基数和pfcount [key…]
合并多个keypfmerge destkey [sourcekey …]合并后放入destkey中

Geospatial

1、简介

Redis3.2中增加了堆GEO的支持,也就是Geographic,地理信息的缩写。改类型存储坐标的经纬度。基于该类型提供经纬度设置、查看、距离查询和范围查询等操作。

2、常用命令

操作命令备注
给key增加一个或多个member的经纬度geoadd key [longitude latitude member …]例如:geoadd china:city 121.47 31.23 shanghai
获取key一个member元素的经纬度geopos key [member…]
获取两个位置之间的直线距离geodist key member1 member2 [unit]unit(单位):m(米)、km (千米)、mi (英里)和ft (英尺)
获取key半径内的元素georadius key longitude latitude radius [unit]unit(单位):m(米)、km (千米)、mi (英里)和ft (英尺)

3、注意

  • 两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。
  • 有效的经度从 -180 度到 180 度。有效的纬度从 -85.05112878 度到 85.05112878 度。
  • 当坐标位置超出指定范围时,该命令将会返回一个错误。
  • 已经添加的数据,是无法再次往里面添加的。

Redis配置文件常用配置项

配置默认值说明
bindbind 127.0.0.1只能接受本机请求访问,不写的话无限制
protected-modeprotected-mode yes保护模式,如果开启,那么在没有设定bind ip且没有密码的情况下,只允许接受本机的响应
Portport 6379端口号
tcp-backlogtcp-backlog 511连接队列,队列总和=未完成三次握手队列+已完成三次握手队列
timeouttimeout 0一个空闲的客户端维持多少秒会关闭,0的意思为永不关闭。
tcp-keepalivetcp-keepalive 0对访问的客户端心跳检测间隔,单位秒,0则不检测
daemonizewindows不支持no是否为后台进程
pidfilewindows不支持pidfile存放pid文件的位置,每一个实例会产生一个不同的pid文件
loglevelloglevel notice指定日志记录级别,总共四种:debug、verbose、notice、warning
logfilelogfile “”日志文件名称
databasesdatabases 16设定库的数量,默认16,默认使用0号库
maxclients默认不开启限制10000同时连接多少客户端,如果到达限制会拒绝新的连接
maxmemory默认不开启,以实际系统内存最大使用内存,Redis通过maxmemory-policy指定的移除规则移除
maxmemory-policymaxmemory-policy noeviction内存不足移除规则:volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl和noeviction
maxmemory-samplesmaxmemory-samples 5清除样本数量

maxmemory-samples参数说明:LRU和最小TTL算法不是精确算法,而是近似算法算法(为了节省内存),可以调整它的速度或准确性。默认情况下,Redis将检查5个关键点并选择一个最近使用较少。值越小样本越不准确,但消耗性能越小

maxmemory-policy移除策略介绍:

策略名介绍
volatile-lru使用lru算法移除key,只对最近最少使用设置了过期时间的建
allkeys-lru在所有key中使用lru算法
volatile-random在过期集合中移除随机的key,只针对设置了过期时间的key
allkeys-random在所有key中随机移除
volatile-ttl移除那些ttl值最小的key,即那些即将过期得key
noeviction(默认值)不进行移除,对申请内存的操作返回错误信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值