文章目录
Redis
Redis 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。
NoSQL
NoSQL Not Only SQL 意为“不仅仅是数据库”,泛指非关系数据库。NoSQL不依赖业务逻辑的方式存储,而以简单的key-value模式存储。因此大大增加了数据库的扩展能力。
1、 特点:
- 不遵循SQL标准
- 不支持ACID
- 性能远超SQL
2、适用场景:
- 对数据高并发的读写
- 海量数据的读写
- 对数据的高可用性
3、不适用场景
- 需要事务支持
- 数据关系处理复杂
redis数据类型
key操作
1、常用命令
操作 | 命令 | 备注 |
---|---|---|
查看当前库所有key | keys * | 无key返回(empty list or set),有key返回key列表 |
判断key是否存在 | exists key | 存在返回1;不存在返回0 |
查看key类型 | type key | |
删除指定的key | del key | |
根据value选择非阻塞删除 | unlink key | 仅将keys从keyspace元数据中删除,删除会在后续异步操作 |
给存在的key设置过期时间 | expire key time | 单位:秒,如果过期则获取不到 |
查看key的过期时间 | ttl key | 返回过期时间,单位:秒,-1永不过期;-2已过期 |
切换库 | select index | Redis默认有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 key | key存在返回长度;不存在返回0 |
key不存在时设置key的值 | setnx key value | key存在返回0不设值;不存在返回1设值 |
key中存储的数字值加减1 | incr/decr key | 值不是数字报错;是数字返回值 |
key中存储的数字值加减n | incrby / decrby key n | 值不是数字报错;是数字返回值 |
同时设置一个或多个键值对 | mset key1 value1 key2 value2… | |
同时获取一个或多个键值对 | mget key1 key2… | |
同时设置一个或多个键值对 | msetnx key1 value1 key2 value2… | 仅当所有key不存在时才成功 |
截取value | getrange 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 value | key不存在返回(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 stop | l0左边第一个,-1右边第一个, 0 -1 表示获取全部 |
按照索引下标获取元素,从左到右 | lindex key index | |
获取列表长度 | llen key | |
在value的前面或后面插入newvalue的值 | linsert key before/after value newvalue | |
从左边删除n个值等于value的元素 | lrem key n value | |
将列表key下标为index的值替换为value | lset 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 value | value在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建赋值value | hset key field value | |
获取key的field的value | hget key field | |
批量设置hash表的值 | hmset key field1 value1 field2 value2… | |
查看key中,是否存在field | hexists key field | 1存在;0不存在 |
获取key中所有field | hkeys key | |
获取key中所有value | hvals key | |
给key中的field的值加n | hincrby key field n | n可以为负数 |
给hey中的field的值设置为value | hsernx key field value | field不存在时才能成功,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加n | zincrby key n value | n可以是负数 |
删除集合指定元素 | 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 value | value只能是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…] | |
合并多个key | pfmerge 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配置文件常用配置项
配置 | 默认值 | 说明 |
---|---|---|
bind | bind 127.0.0.1 | 只能接受本机请求访问,不写的话无限制 |
protected-mode | protected-mode yes | 保护模式,如果开启,那么在没有设定bind ip且没有密码的情况下,只允许接受本机的响应 |
Port | port 6379 | 端口号 |
tcp-backlog | tcp-backlog 511 | 连接队列,队列总和=未完成三次握手队列+已完成三次握手队列 |
timeout | timeout 0 | 一个空闲的客户端维持多少秒会关闭,0的意思为永不关闭。 |
tcp-keepalive | tcp-keepalive 0 | 对访问的客户端心跳检测间隔,单位秒,0则不检测 |
daemonize | windows不支持no | 是否为后台进程 |
pidfile | windows不支持pidfile | 存放pid文件的位置,每一个实例会产生一个不同的pid文件 |
loglevel | loglevel notice | 指定日志记录级别,总共四种:debug、verbose、notice、warning |
logfile | logfile “” | 日志文件名称 |
databases | databases 16 | 设定库的数量,默认16,默认使用0号库 |
maxclients | 默认不开启限制10000 | 同时连接多少客户端,如果到达限制会拒绝新的连接 |
maxmemory | 默认不开启,以实际系统内存 | 最大使用内存,Redis通过maxmemory-policy指定的移除规则移除 |
maxmemory-policy | maxmemory-policy noeviction | 内存不足移除规则:volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl和noeviction |
maxmemory-samples | maxmemory-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(默认值) | 不进行移除,对申请内存的操作返回错误信息 |