- 1. Redis操作
- 2. Redis安装&启动&配置(Linux)
1. Redis操作
1.1. help
help
命令可以查询redis中所有命令的用法
1.2. 基础数据类型
1.2.1. string
help @string
可以查看string类型的所有操作命令。
常用操作:
命令格式 | 描述 |
---|---|
SET key value |
添加一个string类型键值对 |
MSET key value [key value...] |
批量添加多个string类型键值对 |
GET key |
获取一个string类型的值 |
MGET key |
获取多个string类型的值 |
APPEND key value |
对一个string键值对进行内容追加 |
SETEX key seconds value |
设置一个string键值对的时效性 |
… | … |
1.2.1.1. 整数运算
string类型存储单个字符串,如果value为一个整数形式,则可以对其进行整数相关操作,如redis提供了incr
、incrby
、decr
等对整数形式的value进行运算,在运算时会将value转为数值类型进行运算,但底层的数据依然是以字符串的形式存储(redis是用C语言开发的,因此底层存储string用的是char[])
string类型整数形式支持的最大值是9223372036854775807(在Java中为Long.MAX_VALUE)
1.2.1.2. 时效性
redis提供对键值对存储时间的限制,过期自动删除。
SETEX key seconds value
:设置string键值对过期时间,以秒为单位PSETEX key milliseconds value
:功能同上,以毫秒为单位
1.2.2. hash
在redis中,hash是多个string类型的field和value的映射表,是表示Objects的最合适的数据结构。 一个key对应一个hash结构,里面包括多个字段和对应的值。 例如,一个学生对象,包括学号、姓名、年龄等等。
127.0.0.1:6379> hmset user:20210001 name Tom age 22
OK
127.0.0.1:6379> hgetall user:20210001
1) "name"
2) "Tom"
3) "age"
4) "22"
127.0.0.1:6379> hmget user:20210001 name age
1) "Tom"
2) "22"
127.0.0.1:6379>
help @hash
:查看hash数据结构的所有相关命令。
1.2.3. list
在redis中,list用来存储列表数据,底层数据结构为双向链表。
help @list
:查看list相关的操作。
常用操作:
命令 | 描述 | 备注 |
---|---|---|
lpush key value [value ...] |
从左边插入value到键为key的list中 | |
rpush key value [value ...] |
从右边插入value到键为key的list中 | |
lpop key |
删除最左边的元素并返回 | |
rpop key |
删除最右边的元素并返回 | |
lrange key start stop |
获取list中索引从start到stop的values | 索引可以为负数,-n代表从右到左第n个元素 |
lindex key index |
获取list中索引为index的元素 | 同上 |
BLPOP key [key ...] timeout |
在timeout时间内阻塞获取list第一个元素 | 如果timeout内获得则停止等待立即返回 |
BRPOP key [key ...] timeout |
在timeout时间内阻塞获取list最后一个元素 | 同上 |
LREM key count value |
从list中移除一个value |
1.2.4. Set
Set用来存储集合数据,集合中不能有重复的value。Set底层数据结构和hash一样是哈希表。
help @set
:查看Set相关的操作。
常用操作:
命令 | 描述 | 备注 |
---|---|---|
SADD key member [member ...] |
往set中添加元素 | |
SCARD key |
获取set中的元素数量 | |
SISMEMBER key member |
获取set中的所有元素 | |
SREM key member [member ...] |
移除set中的一个或多个元素 | |
SREM key member [member ...] |
移除set中的一个或多个元素 | |
SRANDMEMBER key [count] |
从set中随机返回一个或多个元素 | |
SPOP key [count] |
从set中随机删除并返回一个或多个元素 |
1.2.4.1. 集合运算
集合有3种运算:交、并、差(补) redis对Set实现了这3种运算:
SINTER key [key ...]
:返回多个集合的交集SUNION key [key ...]
:返回多个集合的并集SDIFF key [key ...]
:返回多个集合的差集
此外,redis对集合运算的结果也提供操作,比如SINTERSTORE
、SUNIONSTORE
、SDIFFSTORE
等。
示例:
127.0.0.1:6379> sadd set1 a b c d e
(integer) 5
127.0.0.1:6379> sadd set2 c d e f g
(integer) 5
127.0.0.1:6379> sinter set1 set2
1) "d"
2) "e"
3) "c"
127.0.0.1:6379> sunion set1 set2
1) "d"
2) "b"
3) "f"
4) "g"
5) "a"
6) "c"
7) "e"
127.0.0.1:6379> sdiff set1 set2
1) "a"
2) "b"
127.0.0.1:6379>
1.2.5. sorted_set
redis中sorted_set支持对集合元素排序,每个value对应一个数值类型的score,在添加时设置score的值,依据score排序。
help @sorted_set
:查看所有sorted_set相关命令。
常用操作:
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
:向sorted_set添加一个或多个元素,如果元素存在则更新其scoreZCARD key
:返回sorted_set中元素的数量ZRANGE key start stop [WITHSCORES]
:按照索引返回sorted_set中一定范围的元素(score从低到高)ZREVRANGE key start stop [WITHSCORES]
:按照索引返回sorted_set中一定范围的元素,并按score从高到低的顺序,和ZRANGE顺序相反。- …
1.3. 高级数据类型
1.3.1. bitmaps
bitmaps不是新的存储类型,它使用string结构存储,但最小的存储单位是bit。 bitmaps只能存储状态,用于信息状态统计。
基础操作:
SETBIT key offset value
:置位或复位string某个位GETBIT key offset
:返回string某个bit的值BITCOUNT key [start end]
:统计key对应的string的所有bit中1的个数。BITOP operation destkey key [key ...]
:对多个string进行位运算,结果存到destkey中。- BITOP AND destkey srckey1 srckey2 srckey3 … srckeyN
- BITOP OR destkey srckey1 srckey2 srckey3 … srckeyN
- BITOP XOR destkey srckey1 srckey2 srckey3 … srckeyN
- BITOP NOT destkey srckey
1.3.2. hyperloglog
since:2.8.9
hyperloglog是一种用于基数统计的算法,它基于LogLog算法。在这里,基数是指一个集合内不重复的元素的个数。
- 操作:
PFADD key element [element ...]
:添加元素PFCOUNT key [key ...]
:返回hyperloglog计算出来的近似基数PFMERGE destkey sourcekey [sourcekey ...]
:合并不同的集合。
- 例子:
127.0.0.1:6379> pfadd UV e1 e2 e3 e1 e2 e4 e5 e1 e1 e3 (integer) 1 127.0.0.1:6379> pfcount UV (integer) 5 127.0.0.1:6379>
- 使用场景
可以用于统计网站的UV
1.3.3. GEO
since: 3.2.0
geo是redis提供的用于地理位置信息存储和检索的类型,底层存储结构是sorted set。
操作:
GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]
:添加地理位置点(经度、纬度、名称),经纬度有限制,靠近极点的位置不可索引。The exact limits, as specified by EPSG:900913 / EPSG:3785 / OSGEO:41001 are the following:
- Valid longitudes are from -180 to 180 degrees.
- Valid latitudes are from -85.05112878 to 85.05112878 degrees.
geo没有提供del的方法,由于存储结构是sorted set,因此可以用
ZREM key member [member ...]
删除地理位置点。GEODIST key member1 member2 [unit]
:返回两个地址位置点之间的距离。
unit默认为m,可以是m|km|mi|ftGEOPOS key member [member ...]
:返回地址位置点的经度和纬度GEORADIUS key longitude latitude radius m/km/ft/mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
:返回在key中某个点(输入经纬度)给定半径范围内的所有地理位置点。GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
:返回在key中某个点(输入位置点的name)给定半径范围内的所有地理位置点。GEOHASH key member [member ...]
:返回key中地理位置点的hash值
例子:
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.1516"
redis> GEORADIUS Sicily 15 37 100 km
1) "Catania"
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"
1.4. 通用命令
help @generic
:查看5种类型的key都支持的操作
常用:
DEL key [key ...]
:删除一个或多个keyEXISTS key [key ...]
:判断key在数据库中是否存在,返回存在的key的个数EXPIRE key seconds
:设置key的存活时间PERSIST key
:取消key的有限存活时间TTL key
:返回key剩下的存活时间,单位为seconds- ` PTTL key`:返回key剩下的存活时间,单位为milliseconds
RENAME key
:重命名keyKeys pattern
:查询符合指定规则的key
数据库相关:
SELECT index
:切换选择的数据库MOVE key db
:将key移动到另一个数据库DBSIZE
:返回当前database中key的个数FLUSHDB [ASYNC]
:清除当前数据库中所有的keyFLUSHALL [ASYNC]
:清除所有数据库中的所有key
服务器相关:
ping [message]
:测试服务器连通性ECHO message
:打印给定的字符串
1.5. 数据持久化
Redis中有两种持久化方式:RDB和AOF。
1.5.1. RDB
即Redis database,记录的是Redis数据库中的二进制数据。
save
:将redis数据库中的数据生成.rdb文件,但save是主进程执行,因此会阻塞服务器。bgsave
:功能和save一样,但对于bgsave,服务器会fork一个子进程用于持久化,不会阻塞服务器。
缺点:
- 每一次save/bgsave,dump的都是全部数据,当数据量较大,非常消耗I/O资源。
- fork子进程带来额外的资源消耗
- 宕机可能丢失数据
1.5.2. AOF
即append only file,记录的是Redis的操作日志(命令),Redis服务器启动后执行AOF文件中的命令达到恢复数据的目的。
优点:AOF解决了持久化的实时性,避免丢失数据,目前是Redis数据持久化的主流方式。
1.5.2.1. 开启AOF&相关配置
appendonly yes|no
:是否开启AOF,默认为noappendfsync 策略
:配置缓冲区命令同步到文件的策略appendfilename 文件名
:配置AOF文件名,默认为appendonly.aof。
AOF策略:appendfsync 策略
- always:每一次写入操作都立即同步到AOF文件,性能低。
- everysec(默认):每隔1秒将缓冲区中的指令同步到AOF文件,最坏情况丢失1秒内的写入操作(建议使用)。
- no:让操作系统控制缓存区的命令同步到磁盘,过程不可控。
注意:如果开启了AOF持久化,但是服务器启动没有加载aof文件,检查文件中是否有flushdb/flushall
命令。
1.5.2.2. AOF重写
概念:随着服务器的运行,AOF文件会越来越大,并且多条对相同key操作的指令造成了命令的冗余,在AOF载入内存的时候导致对同一个key执行的命令都会被后面的覆盖。AOF重写是指将多条命令的执行结果转化为最终的结果的命令,精简AOF文件。
重写机制:AOF重写不是对原来的AOF文件进行分析重写,而是直接读取服务器的当前数据库状态实现。
- 手动重写
bgrewriteaof
:执行AOF重写 - 自动重写
auto-aof-rewrite-min-size <size>
auto-aof-rewrite-percentage <percentage>
1.6. 事务
redis事务是一个命令的队列,将若干个命令加入一个队列中,然后一次性按照顺序执行,中间不会被打断。
1.6.1. 操作
- 开始事务:
MULTI
- 结束事务并执行:
EXEC
- 取消事务:
DISCARD
,如果执行了multi
,还没有执行exec
,可以通过执行这个命令来取消当前定义的事务。
1.6.1.1. 注意事项
每个命令进入事务的命令队列之前redis服务器会检查:
- 如果事务的命令队列中命令有语法错误,比如将
SET
误写成SEET
(实际上命令输错了会报错),在执行EXEC
后整个事务都不会执行:实际上命令输错了也会报错:(error) EXECABORT Transaction discarded because of previous errors. - 如果语法没有错误但执行出错,之前已经执行的命令不会“回滚”,换句话说,Redis的事务是不具有原子性的。
1.6.2. WATCH/UNWATCH
WATCH key [key ...]
:监视多个key,如果这些key在WATCH之后、MULTI/EXEC块之前被修改,则事务不会执行。不管事务是否成功执行,EXEC执行后WATCH自动解除。WATCH不能在MULTI/EXEC块中执行。UNWATCH
:对所有被WATCH的key解除监视。
1.7. 过期数据删除策略
在Redis中可以设置key的生存时间,当超过生存时间,key就不可用,但是否会从内存中立即被移除,这取决于选择的过期数据删除策略。
1.7.1. 定时删除(用时间换空间)
创建定时器任务,当key超过生存时间,立即删除key。
- 优点:到点就删除,节约内存空间
- 缺点:对CPU消耗大,影响redis服务器响应时间和命令吞吐量。
1.7.2. 惰性删除(用空间换时间)
当key超过生存时间,不会立即删除,等到下次访问该key时服务器检查已经过期,进行删除操作。
- 优点:对CPU消耗较小
- 缺点:如果有大量过期key且短时间不会访问,会造成内存占用过高
1.7.3. 定期删除
定期对过期key进行随机删除,单位时间对CPU的消耗较稳定且保证内存空间定期清理。
1.8. keys逐出(淘汰)算法
Redis在写入数据前会检测可用内存是否足够,如果结果为否,会执行临时删除一些数据的操作,增加可用内存,这种操作称为逐出算法。
数据逐出算法可能反复执行,当确认无法继续执行时,服务器会报Error:OOM,即内存溢出。
Redis针对逐出算法提供了多种选择:
- 检测易失数据(可能过期的数据:server.db[i].expires)
- volatile-lru:挑选最近最少使用的数据,逐出
- volatile-lfu:挑选一段时期使用次数最少的数据,逐出
- volatile-ttl:挑选将要过期的数据,逐出
- volatile-random:随机挑选数据,逐出
- 检测全库数据(server.db[i].dict)
- allkeys-lru
- allkeys-lfu
- allkeys-random
- 禁止数据逐出
no-enviction:禁止数据逐出
在conf文件中配置逐出策略:maxmemory-policy volatile-lru
2. Redis安装&启动&配置(Linux)
2.1. 安装
Redis原生只有Linux版本,windows版本是其他团队根据linux版本源码重写的。 在Linux上,Redis的安装步骤如下:
- 下载
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
- 解压
- 编译
解压后直接执行
make
命令进行编译
2.2. 配置
解压后redis目录下有一个redis.conf文件,里面包含redis服务器的所有配置。
- 基础配置
bind ip地址
:绑定ip地址,在客户端访问时只能通过这个ip访问。database 数据库数量
port 端口号
daemonize yes|no
:是否以后台守护线程启动。
- 日志配置
loglevel debug|verbose|notice|warning
:日志级别logfile 日志文件名
- 客户端连接配置
maxclients 数量
:设置同时最大的客户端连接数,默认无上限(maxclients 0
)。timeout 时间
:连接空闲超时时间,超时则断开,设置为0则为不限制timeout。
- 多服务器配置
include 配置文件路径
:引入其他conf文件,便于配置复用,可用于多个redis服务器的公共配置。2.3. 后台启动
前台运行直接执行
redis-server 配置文件路径
,如果需要以守护进程的形式在后台运行,需要将conf文件中的daemonize一项设置为yes。