redis简介

什么是Redis

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,
50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,
且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下

1
2
3
4
5
1) 字符串类型 string
2) 哈希类型 hash
3) 列表类型 list
4) 集合类型 set
5) 有序集合类型 sortedset

redis的应用场景

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)
  • 聊天室的在线好友列表
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒
  • 分布式集群架构中的session分离

    基本配置

    1
    2
    3
    4
    port 6379   ;指定的端口号
    requirepass foobared ;设置密码
    bind 127.0.0.1 ;只允许本机连接
    详细见官网 redis.net.cn

    数据操作

    String字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 1   SET key value 设置指定 key 的值
    127.0.0.1:6379> set name panther
    OK
    127.0.0.1:6379> set name panther2
    OK
    127.0.0.1:6379> get name
    "panther2" ;覆盖操作

    # 2 GET key 获取指定 key 的值。
    127.0.0.1:6379> get name
    "panther"
    127.0.0.1:6379> get names
    (nil) ;等同于null

    # 3 SETEX key seconds value 设置过期时间的对象 单位为秒
    127.0.0.1:6379> setex name 5 panther
    OK
    127.0.0.1:6379> get name
    (nil)
    # 4 SETNX key value 只有key不存在时设置key的值
    127.0.0.1:6379> setnx name panther
    (integer) 1
    127.0.0.1:6379> setnx name panther
    (integer) 0

    Hash哈希操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    # HSET key field value  设置key字段的field设置值为value
    127.0.0.1:6379> hset 101 name panther
    (integer) 1
    127.0.0.1:6379> hset 101 age 18
    (integer) 1
    127.0.0.1:6379> hset 101 age 20
    (integer) 0 ; 不会覆盖

    # HGET key field 获取对应field
    127.0.0.1:6379> hget 101 name
    "panther"
    # HDEL key field 删除对应field
    127.0.0.1:6379> hdel 101 age
    (integer) 1
    127.0.0.1:6379> hget 101 age
    (nil)

    # HKEYS key 获取hash表中所有字段
    127.0.0.1:6379> hkeys 101
    1) "name"
    2) "age"

    # HVALS key 获取hash表中所有的值
    127.0.0.1:6379> hvals 101
    1) "panther"
    2) "20"

    # HGETALL key 获取指定key的所有field和value
    127.0.0.1:6379> hgetall 101
    1) "name"
    2) "panther"
    3) "age"
    4) "20"

    list列表操作

  • 简单的String列表,按照顺序插入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # LPUSH key value [value2...]    插入一个或多个数据到头部
    127.0.0.1:6379> lpush list a b c d
    (integer) 4
    # LRANGE key start stop 获取指定范围元素

    127.0.0.1:6379> lrange list 1 2
    1) "c"
    2) "b" ;3-a 2-b 1-c 0-d

    # RPOP key 移出列表最后一个元素
    127.0.0.1:6379> rpop list
    "a"
    # LLEN key 获取列表长度
    127.0.0.1:6379> llen list
    (integer) 3
    # BRPOP key timeout 移出列表最后一个元素,若列表为空进入阻塞等待超时或有元素可弹出时停止

    set集合操作

    set是String类型的无序列表,不可重复
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    # SADD key  member [member...] 添加一个或多个数据
    127.0.0.1:6379> sadd set a b c d
    (integer) 4
    127.0.0.1:6379> sadd set a
    (integer) 0

    # SMEMBERS key 返回集合中所有的成员
    127.0.0.1:6379> smembers set
    1) "b"
    2) "a"
    3) "d"
    4) "c"

    # SCARD key 返回集合的成员数
    127.0.0.1:6379> scard set
    (integer) 4

    # SINTER key1 [key2] 返回给定的集合的交集
    127.0.0.1:6379> sadd set2 a b e
    (integer) 2
    127.0.0.1:6379> sinter set set2
    1) "b"
    2) "a"
    # SUNION key [key2] 返回给定的集合的并集
    127.0.0.1:6379> sunion set set2
    1) "d"
    2) "c"
    3) "a"
    4) "b"
    5) "e"

    # SDIFF key1 [key2] 返回给定集合的差集
    127.0.0.1:6379> sdiff set set2
    1) "d"
    2) "c"

    # SREM key member [member...] 移除集合中一个或多个成员
    127.0.0.1:6379> srem set2 a b
    (integer) 2

    有序集合

  • sored set 通过分数从小到大排序,元素不可重复分数可以
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # ZADD key score member [score member...]  添加一个或多个元素
    127.0.0.1:6379> zadd mysort 60 panther 80 Gin 30 user
    (integer) 3
    127.0.0.1:6379> zadd mysort 50 panther
    (integer) 0 ;没有覆盖数据但是枫分数改了

    # ZRANGE key start stop 输出范围的成员
    127.0.0.1:6379> zrange mysort 0 -1
    1) "user"
    2) "panther"
    3) "Gin"
    127.0.0.1:6379> ZRANGE mysort 0 -1 WITHSCORES
    1) "user"
    2) "30"
    3) "panther"
    4) "50"
    5) "Gin"
    6) "80"

    # ZINCRBY key increment member 向指定成员增加分数
    127.0.0.1:6379> zincrby mysort 50 panther
    "100"
    127.0.0.1:6379> ZRANGE mysort 0 10 WITHSCORES
    1) "user"
    2) "30"
    3) "Gin"
    4) "80"
    5) "panther"
    6) "100"

    # ZREM key member [member...] 移除对应成员
    127.0.0.1:6379> zrem mysort user
    (integer) 1

    redis通用操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # KEYS pattern  查找符合给定模式的key
    127.0.0.1:6379> keys *
    1) "user"
    2) "test"
    3) "set"
    # EXISTS key 判断key是否存在
    127.0.0.1:6379> exists test
    (integer) 1
    # TYPE key 判断key的类型
    127.0.0.1:6379> type name
    string
    127.0.0.1:6379> type mysort
    zset
    # DEL key 删除key
    127.0.0.1:6379> del test
    (integer) 1
    # TTL key 返回key值所剩时间,以秒为单位
    127.0.0.1:6379> setex test 100 panther
    ok
    127.0.0.1:6379> TTL test
    (integer) 93

    使用springdata-redis操作redis

    1. 导入依赖
      1
      2
      3
      4
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>

      环境配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      spring:
      redis:
      host: localhost
      port: 6379
      password: 123456
      database: 0 # redis提供了16个数据库我们使用0号数据库
      jedis:
      pool:
      max-active: 8 #最大连接数
      max-wait: 1ms #最长阻塞时间
      max-idle: 4 # 最大空闲连接
      min-idle: 0 # 最小空闲连接
  • 切换数据库
    1
    2
    3
    4
    127.0.0.1:6379> select 1  ;默认为0号数据库
    ok
    127.0.0.1:6379[1]> get name ;默认为0号数据库
    (nil)