solitaryclown

Redis操作

2022-02-03
solitaryclown

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提供了incrincrbydecr等对整数形式的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对集合运算的结果也提供操作,比如SINTERSTORESUNIONSTORESDIFFSTORE等。

示例:

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添加一个或多个元素,如果元素存在则更新其score
  • ZCARD 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算法。在这里,基数是指一个集合内不重复的元素的个数。

  1. 操作:
    • PFADD key element [element ...]:添加元素
    • PFCOUNT key [key ...]:返回hyperloglog计算出来的近似基数
    • PFMERGE destkey sourcekey [sourcekey ...]:合并不同的集合。
  2. 例子:
    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>
    
  3. 使用场景
    可以用于统计网站的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|ft
  • GEOPOS 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 ...]:删除一个或多个key
  • EXISTS key [key ...]:判断key在数据库中是否存在,返回存在的key的个数
  • EXPIRE key seconds:设置key的存活时间
  • PERSIST key:取消key的有限存活时间
  • TTL key:返回key剩下的存活时间,单位为seconds
  • ` PTTL key`:返回key剩下的存活时间,单位为milliseconds
  • RENAME key:重命名key
  • Keys pattern:查询符合指定规则的key

数据库相关:

  • SELECT index:切换选择的数据库
  • MOVE key db:将key移动到另一个数据库
  • DBSIZE:返回当前database中key的个数
  • FLUSHDB [ASYNC]:清除当前数据库中所有的key
  • FLUSHALL [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一个子进程用于持久化,不会阻塞服务器。

缺点:

  1. 每一次save/bgsave,dump的都是全部数据,当数据量较大,非常消耗I/O资源。
  2. fork子进程带来额外的资源消耗
  3. 宕机可能丢失数据

1.5.2. AOF

即append only file,记录的是Redis的操作日志(命令),Redis服务器启动后执行AOF文件中的命令达到恢复数据的目的。

优点:AOF解决了持久化的实时性,避免丢失数据,目前是Redis数据持久化的主流方式。

1.5.2.1. 开启AOF&相关配置

  • appendonly yes|no:是否开启AOF,默认为no
  • appendfsync 策略 :配置缓冲区命令同步到文件的策略
  • 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文件进行分析重写,而是直接读取服务器的当前数据库状态实现。

  1. 手动重写
    bgrewriteaof:执行AOF重写
  2. 自动重写
    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针对逐出算法提供了多种选择:

  1. 检测易失数据(可能过期的数据:server.db[i].expires)
    • volatile-lru:挑选最近最少使用的数据,逐出
    • volatile-lfu:挑选一段时期使用次数最少的数据,逐出
    • volatile-ttl:挑选将要过期的数据,逐出
    • volatile-random:随机挑选数据,逐出
  2. 检测全库数据(server.db[i].dict)
    • allkeys-lru
    • allkeys-lfu
    • allkeys-random
  3. 禁止数据逐出
    no-enviction:禁止数据逐出

在conf文件中配置逐出策略maxmemory-policy volatile-lru

2. Redis安装&启动&配置(Linux)

2.1. 安装

Redis原生只有Linux版本,windows版本是其他团队根据linux版本源码重写的。 在Linux上,Redis的安装步骤如下:

  1. 下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz
  2. 解压
  3. 编译 解压后直接执行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。


上一篇 Redis概述

Comments

Content