Redis基础知识



Redis介绍

Redis是完全开源的,遵守BSD协议,是一个高性能的key-value数据库.为了保证效率,数据都是缓存在内存中,他也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件.

Redis与其他key-value缓存产品有以下三个特点:

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

Redis优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s .
  • 丰富的数据类型 – Redis支持二进制案例的Strings, Lists, Hashes, SetsOrdered Sets 数据类型操作.
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行.单个操作是原子性的.多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来.
  • 丰富的特性 – Redis还支持publish/subscribe, 通知,key过期等等特性.

Redis适用场景

  • 1.取最新N个数的操作
  • 2.排行榜应用,取TOP N操作
  • 3.需要精确设定过期时间的应用
  • 4.计数器应用
  • 5.uniq操作,获取某段时间所有数据的排重值
  • 6.实时系统,反垃圾系统
  • 7.pub/sub构建实时消息系统(发布与订阅)
  • 8.构建队列系统
  • 9.缓存

Redis环境准备

这里通过docker-compose部署

mkdir -p redis
cd redis

cat >> docker-compose.yaml << EOF 
version: '3'
services:
  redis:
    image: redis:6.0.10-alpine
    ports:
      - 6379:6379
    container_name: redis
    networks:
      deploy:
        ipv4_address: 172.10.0.102
        aliases:
          - redis
    volumes:
      - ./redis.conf:/etc/redis.conf
      # - ./data:/data
    command: redis-server /etc/redis.conf

networks:
  deploy:
    external: true
EOF

cat >> redis.conf << EOF
# redis的databases数量
databases 32
# redis密码
requirepass 123
EOF

# 创建本地公共网络(如果不存在)
docker network ls 
docker netwok rm deploy
docker network create --driver=bridge --subnet=172.10.0.0/16 deploy
docker network inspect deploy

# 启动redis环境
docker-compose up -d

# 进入redis环境
docker exec -it redis redis-cli -h 127.0.0.1 -p 6379 -a 123

Redis数据类型

  • 字符串: String
  • 哈希: Hash
  • 列表: List
  • 集合: Set
  • 有序集合: Zset (Sorted Set)

Redis数据类型 - 字符串: String

redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.

类型是二进制安全的.意思是redisstring可以包含任何数据.比如jpg图片或者序列化的对象.

类型是Redis最基本的数据类型,string类型的值最大能存储512MB.

  • set key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX]get key

    set 设置key对应值为string类型的value
    get 获取对应key的value

    # 给key: name 赋值
    set name "name"
    # 获取key: name 的值
    get name
    # 重新给key: name 赋值,会覆盖原有值
    set name "darebeat"
    get name
    

注意: 一个键最大能存储 512MB.

  • setnx key value

    设置key对应的值为string类型的value,如果key已经存在,返回0,此时不会覆盖原有key的值,nxnot exists的意思

    # 接着上面的命令,如果此时重新给key: name 赋值,则不会覆盖原有值
    setnx name "overwrite"
    get name
    
  • setex key seconds value

    设置key对应的值为string类型的value,并指定此键值对应的有效期.

    # 添加一个 haircolor 为 red ,并指定有效期为10秒
    setex haircolor 10 red
    get haircolor
    
  • setrange key offset value

    设置指定key的value值得子字符串

    # 将126邮箱替换成gmail邮箱
    set email "darebeat@126.com"
    get email
    setrange email 9 gmail.com
    get email
    
  • mset key value [key value ...]

    一次设置多个key的值,成功返回OK,表示所有的值都设置了,失败返回0,表示没有任何值被设置.

    mset key1 test1 key2 test2 key3 30
    get key1
    get key2
    get key3
    
  • msetnx key value [key value ...]

    一次设置多个key的值,成功返回OK,表示所有的值都设置了,失败返回0,表示没有任何值被设置.但是不会覆盖已经存在的key.

    msetnx key3 27 key4 aaa
    get key3
    get key4
    msetnx key4 aaa key5 bbb key6 ccc
    get key4
    get key5
    get key6
    
  • getset key value

    设置key的值,并返回key的旧值.

    getset key3 27
    get key3
    
  • getrange key start end

    获取key的value值得子字符串.

    getrange email 0 7
    
  • mget key [key ...]

    一次获取多个key的值,如果对应key不存在,则对应返回空值(nil).

    mget key3 email key10 key1
    
  • incr key/decr key

    对key的值做递增递减操作,并返回新的值.

    set age 21
    get age
    incr age
    get age
    
  • incrby key increment/decrby key increment

    incr类似,根据指定值递增递减相应数值,key不存在的时候会设置key,并认为原来的value为0.

    set age 21
    get age
    incrby age 6
    incrby score -6
    get age
    
  • append key value

    给指定key的字符串追加value,返回新字符串值得长度.

    set name darebeat
    get name
    append name @126.com
    get name
    
  • strlen key

    取指定key的value值的长度.

    strlen name
    

Redis数据类型 - 哈希: Hash

是一个键值(key=>value)对集合;

它的添加,删除操作都是O(1)(平均);

是一个string类型的fieldvalue的映射表,hash特别适合用于存储对象;

相较于将对象的每个字段存储成string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象.

注意: 每个hash可以存储2^32-1键值对(40多亿)

  • hset key field value [field value ...]hget key field

    设置hash field为指定值,如果key不存在,则先创建.

    hset myhash field1 Hello
    hget myhash field1
    
  • hsetnx key field value

    设置hash field为指定值,如果key不存在,则先创建.如果存在返回0,不覆盖原有值.

    hsetnx user:001 name "test"
    hsetnx user:001 name "darebeat"
    hget user:001 name
    
  • hmset key field value [field value ...]hmget key field [field ...]

    同时设置和获取hash的多个field.

    # hmset, hget 命令
    # hmset 设置了两个 field=>value 对, hget 获取对应 field 对应的 value
    hmset user:002 name "darebeat" age "27"
    hmget user:002 name age
    
  • hincrby key field increment

    根据指定值递增递减相应数值,field不存在的时候会设置field,并认为原来的value为0.

    hincrby user:002 age 3
    hincrby user:002 sex 1
    hmget user:002 age sex
    
  • hexists key field

    测试hash中field是否存在.

    hexists user:002 weight
    
  • hlen key

    返回指定hash的field数量

    hlen user:002
    
  • hdel key field [field ...]

    删除指定hash的field.

    hdel user:002 age
    hget user:002 age
    
  • hkeys keyhvals key

    返回hash的所有field和value.

    hkeys user:002
    hvals user:002
    
  • hgetall key

    获取某个hash中全部field和value.

    hgetall user:002
    

Redis数据类型 - 列表: List

List是一个链表结构,主要功能是push,pop,获取一个范围的所有值等;操作中key理解为链表名字.

是一个每个子元素都是string类型双向链表.

可以通过push,pop操作从链表的头部或尾部添加删除元素,这样list既可以作为栈,又可以作为队列.

  • lpush key element [element ...]

    在key对应的list头部添加字符串元素.这是一个栈结构,后进先出.

    lpush list1 "Hello"
    lpush list1 "World"
    lrange list1 0 -1
    
  • rpush key element [element ...]

    在key对应的list尾部添加字符串元素.这是一个队列结构,先进先出.

    rpush list2 "one"
    rpush list2 "two"
    rpush list2 "three"
    lrange list2 0 -1
    
  • linsert key BEFORE|AFTER pivot element

    在key对应的list的特定位置前或后添加字符串.

    rpush list3 "World"
    linsert list3 before "World" "Hello"
    linsert list3 after "World" "!"
    lrange list3 0 -1
    
  • lset key index element

    设置list中指定下标的元素值.

    lset list3 2 "?"
    lrange list3 0 -1
    
  • lrem key count element

    从key对应list中删除n个和value相同的元素.(n<0从尾部删除,n=0则全部删除)

    rpush list4 "hello"
    rpush list4 "hello"
    lrem list4 1 "hello"
    lrange list4 0 -1
    
  • ltrim key start stop

    保留指定key的值范围内的数据.

    rpush list5 "one"
    rpush list5 "two"
    rpush list5 "three"
    rpush list5 "four"
    ltrim list5 1 -1
    lrange list5 0 -1
    
  • lpop keyrpop key

    从list的头部或尾部删除元素,并返回删除元素.

    lpop list5
    lrange list5 0 -1
    
  • rpoplpush source destination

    从第一个list的尾部移除元素并添加到第二个list的头部.

    lrange list2 0 -1
    lrange list3 0 -1
    rpoplpush list2 list3
    lrange list2 0 -1
    lrange list3 0 -1
    
  • lindex key index

    返回名称为key的list中index位置的元素.

    lindex list3 1
    

Redis数据类型 - 集合: Set

Set是集合,它是string类型的无序集合;

通过hash table实现添加,删除和查找,复杂度都是O(1);

对集合我们可以取并集,交集,差集;通过这些功能,实现sns中的好友推荐和blog的tag功能.

  • sadd key member [member ...]

    向集合添加一个或多个成员.

    sadd set0 hello xxx vvvv
    sadd set0 world
    sadd set0 world
    
  • smembers key

    查看set中的元素.

    smembers set0
    
  • scard key

    获取集合的成员数.

    scard set0
    
  • srem key member [member ...]

    移除集合中一个或多个成员.

    sadd set1 one
    sadd set1 two
    sadd set1 three
    smembers set1
    srem set1 two
    smembers set1
    
  • spop key

    随机返回并删除名称为key的set中的一个元素.

    sadd set2 one
    sadd set2 two
    sadd set2 three
    sadd set2 four
    sadd set2 five
    smembers set2
    spop set2
    spop set2
    
  • sdiff key [key ...]

    返回所有给定key与第一个key的差集.

    sdiff set1 set2
    sdiff set2 set1
    
  • sdiffstore destination key [key ...]

    返回所有给定key与第一个key的差集,并将结果存到另一个destination.

    sdiffstore setres1 set2 set1
    smembers setres1
    
  • sinter key [key ...]

    返回所有给定key的交集.

    sadd set1 nine
    sadd set2 nine
    sadd set3 nine
    sinter set1 set2
    sinter set1 set2 set3
    
  • sinterstore destination key [key ...]

    返回所有给定key的交集,并将结果存到另一个destination.

    sinterstore setres2 set1 set2 set3
    smembers setres2
    
  • sunion key [key ...]

    返回所有给定key的并集.

    sunion set1 set2
    
  • sunionstore destination key [key ...]

    返回所有给定key的并集,并将结果存到另一个destination.

    sunionstore setres3 set1 set2 set3
    smembers setres3
    
  • smove source destination member

    从第一个source对应的set中移除member并添加到第二个destination对应的set中.

    sadd set1 ten
    smembers set1
    smove set1 set3 ten
    smembers set1
    smembers set3
    
  • sismember key member

    测试member是否是名称为key的set中的元素.

    sismember set3 ten
    sismember set3 one
    
  • srandmember key [count]

    随机返回名称为key的set中的一个或多个元素,但不删除元素.

    srandmember setres3 
    srandmember setres3 2
    

Redis数据类型 - 有序集合: Zset

set一样也是string类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序.

有序集合的成员是唯一的,但分数(score)却可以重复.

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1). 集合中最大的成员数为2^32-1 (4294967295, 每个集合可存储40多亿个成员).

  • zadd key [NX|XX] [CH] [INCR] score member [score member ...]

    向有序集合添加一个或多个成员,或者更新已存在成员的分数.

    zadd zset0 0 one
    zadd zset0 1 two
    zadd zset0 2 three
    zadd zset0 3 four
    zadd zset0 4 five
    
  • zrange key start stop [WITHSCORES]

    通过索引区间返回有序集合指定区间内的成员

    zrange zset0 0 -1 withscores
    
  • zrevrange key start stop [WITHSCORES]

    返回有序集中指定区间内的成员,通过索引,分数从高到低

    zrevrange zset0 0 -1 withscores
    
  • zcard key

    获取有序集合的成员数.

    zcard zset0
    
  • zcount key min max

    计算在有序集合中指定区间分数的成员数

    zcount zset0 0 2
    
  • zincrby key increment member

    有序集合中对指定成员的分数加上增量 increment.

    zincrby zset1 2 age
    zrange zset1 0 -1 withscores
    
  • zrank key member

    返回有序集合中指定成员的索引.

    zrank zset0 one
    zrank zset0 two
    zrank zset0 three
    
  • zrevrank key member

    返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

    zrevrank zset0 one
    zrevrank zset0 two
    zrevrank zset0 three
    
  • zrangebyscore key min max [WITHSCORES] [LIMIT offset count]

    通过分数返回有序集合指定区间内的成员

    zrangebyscore zset0 1 4 withscores
    
  • zrevrangebyscore key max min [WITHSCORES]

    返回有序集中指定分数区间内的成员,分数从高到低排序

    zrevrangebyscore zset0 5 0 withscores
    
  • zscore key member

    返回有序集中,成员的分数值

    ZSCORE zset0 one
    ZSCORE zset0 two
    
  • zunionstore destination numkeys key [key ...]

    计算给定的一个或多个有序集的并集,并存储在新的 key 中

    zadd zset1 0 10 
    zadd zset1 1 11
    
    zadd zset2 0 11
    zadd zset2 1 12
    zunionstore zsetres1 3 zset1 zset2 zset0
    zrange zsetres1 0 -1 withscores
    
  • zinterstore destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

    计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中.

    zinterstore zsetres2 2 zset1 zset2
    zrange zsetres2 0 -1 withscores
    
  • zlexcount key min max

    在有序集合中计算指定字典区间内成员数量

    zadd chars 2 a 2 b 2 c 3 d 3 e
    zadd chars 4 f 4 g 5 h 5 i
    zlexcount chars - +
    zlexcount chars [b [f
    zlexcount chars (b (f
    
  • zrangebylex key min max [LIMIT offset count]

    通过字典区间返回有序集合的成员

    zrangebylex chars - +
    zrangebylex chars [c +
    
  • zrem key member [member ...]

    移除有序集合中的一个或多个成员

    zrem zset0 one two
    zrange zset0 0 -1 withscores
    
  • zremrangebylex key min max

    移除有序集合中给定的字典区间的所有成员

    zremrangebylex chars (c (f
    zrange chars 0 -1 withscores
    
  • zremrangebyrank key start stop

    移除有序集合中给定的排名区间的所有成员

    zadd site 8 "darebeat.cn" 7 "www.darebeat.cn" 2 "baidu.com" 3 "qq.com"
    zremrangebyrank site 0 1
    zrange site 0 -1 withscores
    
  • zremrangebyscore key min max

    移除有序集合中给定的分数区间的所有成员

    zadd site1 8 "darebeat.cn" 7 "www.darebeat.cn" 2 "baidu.com" 3 "qq.com"
    zremrangebyscore site1 7 8  # 移除所有score在7到8
    zrange site1 0 -1 withscores
    

文章作者: darebeat
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 darebeat !
  目录