redis使用手册

本文介绍了 Redis 的五种主要数据类型:字符串、散列、列表、集合和有序集合的特点及应用场景,并探讨了 Redis 的事务处理、脚本编写以及持久化机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串
1、Redis命令不区分大小写
2、字符串型是Redis最基本的数据类型,能存任何形式的字符串,包括二进制数据。一个字符串类型最大容量是512M
3、字符串类型是其他4种数据类型的基础,其他数据类型和字符串类型的差别从某种程度来说只是组织字符串的形式不同
4、incr key
   当存储的字符串是整数形式时候,Redis提供了incr命令,其作用是让当前键值递增,并返回增值后的值。当要操作的键不存在时会默认值为0,所以第一次增值后的结果为1;
5、键的命名:建议“对象类型:对象ID:对象属性”
6、set key value
   get key
7、incrby命令与incr命令基本一样,只不过前者可以通过increment参数指定一次增加的数值
   如:Incrby mzx 3 给key为mzx自增3
   类似还有
  decr key
  decrby key decrement
8、增加指定浮点数
  incrbyfloat key increment
9、向尾部追加值
  append key value
10、获取字符串长度
  strlen key
11、同时设置/获取多个键值
  mset key1 value1 key2 value2...
  mget key1 key2




               (key)      (field) (value)
散列类型 hash<String,Hash<String,String>>
1、散列类型的键值是一种字典结构,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,散列类型不能嵌套其他的数据类型。
   Redis的其他数据类型同样不支持数据类型嵌套。
2、散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。
   例如:键 字段 字段值   car:2  color 白色
3、赋值与取值
   hset key field value
   hget key field
   hmset key field1 value1 field2 value2...
   hmget key field1 field2..
   hgetall key
4、hset命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在。当执行插入则返回1,执行更新则返回0。更进一步,如何键本身不存在,则自动创建
5、在Redis中每个键都属于一个明确的数据类型,如通过hset命令建立的键是散列类型,通过set命令建立的键是字符串类型等。使用一种数据类型的命令操作另外一种数据类型会保错。
   但并不是所有都如此,比如set命令可以覆盖已经存在的键而不论原来键是什么类型
6、判断字段是否存在
  散列 hexists key field
  字符串 exists key
7、当字段不存在时赋值(原子操作)
  散列 hsetnx key field value
  字符串 setnx key value
8、增加数字
  散列 hincrby key field increment
  字符串 incrby key increment
  之前键不存在,HINCRBY命令会自动建立该键并默认score字段在执行命令前的值
为“0”。命令的返回值是增值后的字段值
9、删除字段
  hdel key field1 field2...
  可以通过del key 删除整个key(估计不管啥类型)
10、只获取字段名或字段值
  hkeys key
  hvals key
11、获取字段数量
  hlen key




列表类型
1、列表类型可以存储一个有序的字符串列表,常用的操作室向列表两端添加元素,或者获得列表的某一个片段。
  使用双向链表实现,故向两端添加的复杂度为O(1)。通过索引访问元素的速度慢
2、使用场景:
   如社交网站的新鲜事,获取其中最新的100条数据;
   用来记录日志,可以保证新日志的速度不会受到已有日志数量的影响
   可作为队列使用
3、向列表两端添加元素
   lpush key value1 value2..
   rpush key value1 value2..
4、从列表两端弹出元素
   lpop key
   rpop key
5、获取列表元素的个数
   llen key
6、获取列表片段
   lrange key start stop(stop 大于实际范围,返回最右边元素)
   lrange key -2 -1 (表示从右边开始计算序数)
7、删除列表中指定的值
   lrem key count value(删除列表中前count个值为value的元素,返回实际删除的个数)
   当count>0则从左边开始删除
   当count<0则总右边开始删除
   当count=0则删除所有值为value的元素
8、获取/设置指定索引的元素值
   lindex key index
   lset key index value
9、只保留列表指定片段
   ltrim key start end
10、向列表插入元素
   linsert key before|after pivot value
   在列表中从左到右查找值为pivot的元素,然后根据第二个参数将value插入到该元素的前面或后面




集合类型
1、集合和列表非常类似,差别在于:
   集合的元素不是有序的,而列表有序
   集合的元素是唯一的,而列表不唯一
2、增加/删除元素
   sadd key member1 member2...
   srem key member1 member2...
3、获取集合中所有的元素
   smembers key
4、判断元素是否存在集合中
   sismember key member
5、集合间运算
   sdiff key1 key2..(A-B)
   sinted key1 key2..(A和B的交集)
   sunion key1 key2..(A和B的并集)
6、使用场景:
   文章标签(post:文章ID:tags为键名存储文章的标签)


有序集合
1、在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们
   不仅可以完成插入、删除和判断元素是否存在等集合支持的操作,还能获得分数最好或最低的前N
   个元素、获取指定分数范围内的元素等与分数相关的操作。虽然集合中每个元素都不同,但是它们
   的分数却可以相同
2、有序集合和列表的区别:
  (1)有序集合类型是使用散列表和跳跃表实现的,所以即使读取位于中间元素也很快
  (2)列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
  (3)有序集合要比列表类型更耗内存  
3、增加元素
  zadd key score member score member...
4、获取元素的分数
  zscore key member
5、获取排名在某个范围的元素列表
  zrange key start stop[withscores]
6、获取指定分数范围的元素
  zrangebyscore key min max[withscores]
  


Redis事务
1、Redis保证一个事务中的所有命令要么执行,要么不执行。如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。
   而一旦客户端发送了EXEC命令,所有的命令就都会执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。
2、(语法错误)在事务中,只要有一个命令有语法错误,执行EXEC命令后Redis就会直接返回错误,连语法正确的命令也不会执行。
3、(运行错误)运行错误指在命令执行出现的错误,比如散列类型的命令操作集合类型的键,这种错误在实际执行之前Redis是无法发现的,所以在事务里这样的命令式
   会被Redis接受并执行的。如果事务里的一条命令出现了运行错误,事务里的其他命令依然会继续执行(包括出错命令之后的命令)
4、Redis的事务不支持回滚功能。保持简洁和快速
5、watch命令可以监控一个或多个键,一旦其中一个键被修改或删除,之后的事务就不会执行。监控一直持续到EXEC命令执行




Redis脚本
1、Redis脚本不能使用全局变量,只允许使用局部变量以防止脚本之间相互影响。
2、Lua的表类索引是从1开始的
3、逻辑操作符。只要操作数不是nil或false,逻辑操作符就认为操作数是真,否则是假。特别需要注意的是即使是0或空字符串也被当做真。
   1 and 5 --5
   1 or 5 --1
   not 0 --false(0为真)
   ''or 1 --''
4、连接操作符。用来连接2个字符串——'..'
   print('hello'..' '..'world!') --'hello world'
5、取长度操作符。——#
   print(#'hello') --5
6、Redis与Lua交互
  (1)在脚本中可以通过使用redis.call函数调用Redis命令
      redis.call('set','foo','bar')
      local value = redis.call('get','foo') --value的值为bar
     Redis还提供了redis.pcall函数,功能与redis.call相同,唯一的区别是当命令执行出错的时候redis.pcall会记录错误并继续执行,而redis.call会直接返回错误,不会继续执行
  (2)从脚本中返回值
  (3)脚本相关命令
      1、eval命令
        Redis提供了EVAL命令可以使开发者像调用其他Redis内置命令一样调用脚本。
        EVAL "redis.call('set', KEYS[1],ARGV[1])" 1 foo bar   --KEYS ARGV 一定得大写
      2、EVALSHA命令
        Redis提供了EVALSHA命令允许开发者通过脚本内容的SHA1摘要来执行脚本,改命令用法与EVAL一样,只不过是将脚本内容替换成脚本内容的SHA1摘要。
        在程序中使用EVALSHA命令的一般流程如下:
        (1)先计算脚本的SHA1摘要,并使用EVALSHA命令执行脚本。
        (2)获得返回值,如果返回"NOSCRIPT"错误则使用EVAL命令重新执行脚本。
7、


8、


Redis的持久化
   Redis支持2种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用一种或将二者结合使用
1、RDB方式
    RDB方式的持久化是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。
   进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动键的个数。当在指定的时间内被更改的键的个数
   大于指定的数值时就会进行快照。RDB是Redis默认采用的持久化方式,在配置文件中已经预置了3个条件:
      save 900 1(900秒内有至少一个键被更改则进行快照)
      save 300 10
      save 60  10000
   Redis默认将快照文件存储在当前的目录的dump.rdb文件中,可以通过配置dir和dbfilename2个参数分别指定快照文件的存储路径和文件名
   快照的过程如下:
  (1)Redis使用fork函数复制一份当前的进程(父进程)和副本(子进程);
  (2)父进程继续接收并处理客户端发来的命令,而子进程开始将内存的数据写入硬盘中的临时文件;
  (3)当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。
    在执行fork的时候操作系统会使用写时复制策略,即fork函数反射的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令),
   操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行一刻的内存数据。
  通过上诉过程可以发现Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换,也就是说任何时候RDB文件都是完整的。这使得我们可以通过
   定时备份RDB文件来实现Redis数据库备份。
    除了自动快照,还可以手动发送SAVE和BGSAVE命令让Redis执行快照,2个命令的区别在于,前者是由主进程进行快照操作,会堵塞住其他的请求,后者会通过fork子进程进行快照操作。
    通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据,这就需要开发者根据具体的场合,通过组合设置自动快照条件的方式来将可能发生的数据
   损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。


2、AOF方式
  (1)AOF默认是关闭的,可以通过APPendONLY参数开启: appendonly yes 
  (2)AOF文件时纯文本文件,其内容正是Redis客户端向Redis发送原始通信协议的内容
  (3)Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少。


复制(一台服务器上的数据库更新后,可以自动将更新到额数据同步到其他服务器上,Redis提供了复制功能可以自动完成同步过程)
  (1)配置
同步后的数据库分成2类,一类是主数据库,一类是从数据库。主数据库可以进行读写操作,当发生写操作时自动将数据同步给从数据库。
   而从数据库一般是只读的,并接受主数据库同步过来的数据。一个数据库可以拥有多个从数据库,而一个从数据库只能有一个主数据库。
在Redis中使用复制功能非常容易,只需要在从数据库的配置文件中加入”slaveof主数据库IP主数据库的端口“即可,主数据库无需进行任何配置
默认的情况下从数据库是只读的,如果直接修改从数据库的数据会出现错误。
  (2)原理
当一个从数据库启动后,会向主数据库发送SYNC命令,主数据库收到SYNC命令后会开始在后台保存快照(即RDB持久化的过程),并将保存期间接收到的命令缓存起来(缓存过程漏掉的)。当快照完成后,
   Redis会将快照文件和所有缓存的命令发送给从数据库。从数据库收到后,会载入快照文件并执行收到的缓存的命令。当主从数据库断开重连后会重新执行上述操作,不支持断点续传。
实际的过程略复杂一些,由于Redis服务器使用TCP协议通信
在复制的过程中,快照无论在主数据库还是从数据库中都起了很大的作用,只要执行复制就会进行快照,即使我们关闭了RDB方式的持久化(通过删除所有save参数)。更进一步,无
   论是否启用了RDB方式的持久化,Redis在启动时都会尝试读取dir和dbfilename两个参数指定的RDB文件来恢复数据库。
  (3)读写分离
在读的频率大于写,可以通过复制功能建立多个从数据库,主数据库只进行写操作,从数据库负责读操作
  (4)另一个相对耗时的操作时持久化,为了提高性能,可以通过复制功能建立若干个从数据库,并在从数据库中启用持久化,同时在主数据库中禁止持久化。当从数据库奔溃时重启后主数据库会自动将数据同步过来,
   所以无需担心数据丢失。而当主数据奔溃时,需要在从数据库中使用SLAVEOF NO ONE命令将从数据库提升成主数据库继续服务,并在原来的主数据库启动后使用SLACEOF命令将其设置成新的主数据库的从数据库,即可将
   数据同步回来。


   













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值