Redis入门

Redis简介

Redis是一个高性能内存key-value数据库,和其他key-value缓存产品相比有其他特点:

  1. Redis支持数据持久化,可以将内存中的数据保存在磁盘中,重启时可以重新加载使用;
  2. Redis不仅支持简单的key-value类型的数据,同时还提供list,set,hash,zset等数据结构;
  3. Redis支持数据备份,即master-slave模式。

Redis性能极高,读110000次/s,写81000次/s。

Redis的所有操作都是原子性的,单个操作是原子性的,多个操作可以支持事务,通过multi和exec指令包起来。

Redis还支持pulish/subscribe,通知,key过期等特性。

安装

windows下使用和安装

下载地址

  1. 解压后将文件夹名字改为redis;
  2. 进入redis目录打开cmd窗口,运行以下命令打开redis服务器(win10下的powershell似乎不行,原因不明)redis-server.exe redis.windows.cof
  3. 另启一个cmd窗口,启动redis客户端连接服务器redis-cli.exe -h 127.0.0.1 -p 6379

linux下使用和安装

暂未用,后续用到再记录

Redis的五大数据结构

redis存储的是key-value键值对,所谓的五大数据结构指的是value的类型,key一般都是string类型,其中key定义的时候不要过长或过短,最好有统一的命名规范。

String

string类型是以二进制存储的,这意味着redis的string可以包含任意数据,比如图片或序列化对象,一个string类型的值最大能存储512MB。

常用命令

  1. set key value
  2. get key
  3. getrange key start end 返回key中字符串值从start到end的字符
  4. getset key value 将指定key的值设为value,但返回旧值
  5. mget key1 [key2..]获取多个给定key的值
  6. setex key seconds value设置key和value,并将key的过期时间设为seconds
  7. setnx key value只有key不存在时才设值
  8. mset key value [key value..]同时设置多个k-v对
  9. incr key将key中存储的值加1,若value不能转化成整数,则会报错
  10. incrby key increment将key对应的value加increment
  11. decr key
  12. decrby key decrement
  13. append key value 在key对应的值后拼接字符串key

hash

hash特别适合存储对象,每个hash可以存储2^32-1个键值对(42.9亿)

常用命令

  1. hdel key field1 [field2..]删除key中某个字段
  2. hexists key field判断字段是否存在你
  3. hget key field
  4. hgetall key 获得key所有字段和值
  5. hincreby key field increment
  6. hkeys key获取key中所有字段
  7. hlen key获取key中字段数量
  8. hmget key field1 [field2..]
  9. hmset key field1 value1 [field2 value2..]
  10. hset key field value
  11. hsetnx key field value
  12. hvals key获取key所有值

list

字符串列表,可以左右添加,用作消息队列等,列表最多存储2^32-1个元素。

常用命令

  1. lpop key弹出左边第一个元素
  2. lpush key value1 [value2..]在左边依次插入多个值
  3. llen key获取列表长度
  4. lrange key start end获取列表指定范围内的元素,-1表示倒数第一个元素,依次类推
  5. lrem key count value从左往右删除count个value值
  6. lset key index value通过索引设置值
  7. rpop key弹出右边第一个元素
  8. rpoplpush source dest移除source右边第一个元素,加入到dest最左边
  9. rpush key value1 [value2..]

set

是字符串的无序集合,元素不可重复,是通过哈希表实现的,所以添加删除查找的时间复杂度都是O(1),最大成员数2^32-1,支持交并差。

常用命令

  1. sadd key mem1 [mem2..]
  2. scard key 获取集合的成员数
  3. sdiff key1 [key2]返回key1和key2的差集
  4. sdiffstore dest key1 [key2]返回key1和key2的差集并存入dest中
  5. sinter key1 [key2]交集
  6. sinterstore dest key1 [key2]
  7. sunion key1 [key2]并集
  8. sunionstore dest key1 [key2]
  9. sismember key member判断member是否在集合key中
  10. smembers key返回key的成员
  11. smove source dest member将member从source移到dest中
  12. spop key移除并返回集合中的一个随机数
  13. srandmember key [count] 随机返回集合中count个元素
  14. srem key member1 [member2] 移除集合中元素

zset

除了有序外,和set相同,每个元素会关联一个double的分数,通过该分数排序,zset成员是唯一的,但是成员的分数可以相同。

常用命令

  1. zadd key score1 member1 [score2 member2..]
  2. zcard key
  3. zcount key min max 计算在有序集合中指定区间分数内的成员数
  4. zincrby key increment member 在有序集合中对指定成员的分数加上增量
  5. zinterstore dest numkeys key [key..]求numkeys个有序集合的交集并存到dest中
  6. zrange key start end [withscores]返回有序集合指定范围内的值(可带分数)
  7. zrevrange key start end [withscores]
  8. zremrangebyrank key start end按索引删
  9. zremrangebyscore key start end按分数删
  10. zrank key member返回有序集合中指定成员的索引
  11. zrem key member [member..]
  12. zremrangebylex key min max移除有序集合中给定的字典区间的所有成员
  13. zrangebyscore key min max [withscores] [limit]通过分数返回有序集合指定区间内的成员

持久化

redis的高性能是因为它所有数据都存在内存当中,要保证重启后数据不丢失,就需要数据持久化。有两种方式——RDB和AOF,可以只用一种,也可以两种结合使用。

RDB方式

在指定的时间间隔内将数据集快照写入到磁盘。

优势

  1. 整个redis数据只包含一个文件,备份方便
  2. 对于灾难恢复,比较容易
  3. 性能最大化,分叉出一些子进程,由子进程进行持久化

劣势

  1. 不能保证有效性,因为是定时写的
  2. fork子进程太多

配置

默认持久化方法,在redis.conf中,保存文件是dump.rdb

AOF方式

将以日志的形式记录redis的每一次操作,当redis重启时会从该日志重现redis的每一次操作,重构redis。

优势

  1. 能带来更高数据安全性,有三种同步:每秒同步、每个修改同步、不同步
  2. 对日志文件写入采用append模式,所以即便写入的时候出错,也不会影响日志,可以通过redis -check -aof来解决数据一致性
  3. 如果日志过大,可以自动重写,在重写切换的时候可以更好地保证安全性
  4. 日志文件格式清晰

劣势

  1. 对于相同数据集而言,aof文件比rdb文件大
  2. aof执行效率上会低于rdb

配置

不是默认方式,也在redis.conf中,查找到appendonly no这一行。