笔记-数据库-redis

 

1.      redis简介

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

它支持多种类型的数据结构,如 strings,hashes,lists,sets,有序集合sorted sets 。

 

数据库已经有很多了 ,db2,oracle,mysql,为什么还需要redis呢?

设计源自需求,redis的面对的需求是跨程序的内存级别的数据共享和管理,简单来说,有一小部分数据需要能够拥有内存速度级别的快速访问,又要能够跨程序访问,具有一定管理功能,最好还能够在需要的时候可以向硬盘写入和读取;

实现方法就是内存数据库了,redis是其中一种实现模式,类似的还有memcached。

总而言之,redis是一款优秀的nosql(非关系型),key-vlaue,内存级别的数据库!redis是单线程,操作是安全的。

常用场景是热数据,计数器,队列,分布式锁,最新列表等。

 

1.1.    redis优点

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

 

 

2.      redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

 

  1. String(字符串)

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

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

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

 

  1. Hash(哈希)

Redis hash 是一个键值(key=>value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

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

 

  1. List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

列表最多可存储 2^32 - 1 元素 (4294967295, 每个列表可存储40多亿)。

 

  1. Set(集合)

Redis的Set是string类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd 命令

添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。

集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

 

  1. zset(sorted set:有序集合)

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

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

zset的成员是唯一的,但分数(score)却可以重复。

zadd 命令

添加元素到集合,元素在集合中存在则更新对应score

 

3.      redis 安装、启动及连接

3.1.    安装

3.1.1.   windows环境

  1. 下载安装包;
  2. 解压,进入目录;
  3. cmd下执行redis-server.exe redis.windows.conf

 

3.1.2.   linux环境

  1. 下载安装包;
  2. tar –xzf redis-….gz
  3. cd redis….
  4. make
  5. .src/redis-server

 

3.2.    start redis及连接

启动redis-server

连接/查看是否启动成功redis-cli

 

4.      数据库管理

4.1.    启动/关闭/查看状态

  1. 启动:redis-server redis-conf
  2. 关闭:redis-cli shutdown
  3. 查看是否运行:ps aux|grep redis
  4. 设置密码后,上述关闭命令无效:

redis-cli -a [password]

回车后输入:shutdown

即可关闭redis,输入exit 退出。

 

4.2.    连接

本地连接数据库:redis-cli

远程连接:redis-cli  –h 192.168.. –p 6379

 

4.3.    配置管理

redis配置文件是redis-conf;

4.3.1.   远程访问管理

需要做两点配置,首先将protected-mode 置为no;然后注释或修改访问限定IP

bind项。

4.3.2.   添加访问密码

  1. 添加密码

在配置文件中找到requirepass,添加密码即可

格式是requirepass password

注意,重启后可能启动redis失败,报错为打不开redis.conf,在启动时输入文件全路径即可。

  1. 带密码访问

连接命令不变,但连接后执行命令时会报错:(error) NOAUTH Authentication required.

使用auth password命令进行授权即可。

 

 

5.      数据操作/管理命令

5.1.    键命令

命令的基本语法如下:

command key_name

1. keys pattern 查看符合模式的键;
2. del keyname 删除键
3. rename keyname newkeyname      修改键名
4. type key 返回key的类型
5. dump key 序列化给定的key,返回序列化后的值;
6. exists key 是否存在key
7. expire key seconds 为key设定过期时间,单位秒;
8. expireat key timestamp 设置过期时间,timestamp是unix时间戳;
9. pexpire key milliseconds 设置过期时间,单位毫秒;
10. move key db 将key移动到指定数据库db中;
11. persist key 移除过期时间;
12. pttl key 返回剩余过期时间,单位毫秒;
13. ttl key返回剩余过期时间,单位秒;
14. randomkey 从当前数据库中随机返回一个key;
15. renamenx key newkey 仅当newkey不存在时,将key改名为newkey;

 

5.2.    string命令
键命令的基本语法如下:
command key_name
 
1. set key value
2. get key
3. getrange key start end
4. getset key value 将key的值设为value,并返回旧值;
5. getbit key offset
6. mget key1 [key2] 获取多个key的值
7. setbit key offset value
8. setex key seconds value 将value关联到key,并将key的过期时间设置为seconds,单位为秒;
9. setnx key value 只有在key不存在的时候设置key的值;
10. setrange key offset value
11. strlen key
12. mset key value [key value] 同时设置一个或多个key的值;
13. msetnx key value [key value] 同时设置一个或多个key的值,当且仅当所有key不存在;
14. psetex key milliseconds value 类似setex,但单位是毫秒;
15. incr key  将key中储存的数字加1;
16. incrby key increment
17. incrbyfloat key increment
18. decr key 数值减1
19. append key value
 
5.3.    hash命令
redis hash是一个string类型的field和value的映射表;
1. hdel key field1 [field2]
2. hexists key field
3. hget key field
4. hgetall key
5. hincrby key field increment 为key中指定字段的整数值增量increment;
6. hincrbyfloat key field incrment
7. hkeys key 获取key所有的field
8. hlen key
9. hmget key field1 [field2]
10. hmset key field1 value1 [field2 value2]
11. hset key field value
12. hsetnx key field value
13. hvals key 获取哈希表中所有值
14. hscan key cursor [match pattern ] [count count] 迭代哈希表中的键值对;

 

5.4.    列表命令

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

    1. blpop key1 [key2] timeout       移出并获取列表的第一个元素,如果列表没有元素会阻塞至超时或有元素;
    2. brpop key1 [key2] timeout 与上一命令类似,不过移出最后一个元素;
    3. brpoppush source destination timeout   从列表中弹出一个值,将弹出的元素插入另外一个列表并返回它,如无元素阻塞至超时;
    4. lindex key index 通过索引获取列表中的元素;
    5. linsert key before|after pivot value 在列表的元素前/后插入元素
    6. llen key
    7. lpop key
    8. lpush key value [value2]
    9. lpushx key value
    10. lrange key start stop
    11. lrem key count value
    12. lset key index value
    13. ltrim key start stop     修剪列表,只保留指定区间内的元素;
    14. rpop key
    15. rpoplpush source destination
    16. rpush key value [value2]
    17. rpushx key value

    5.5.    set

    redis set是strin类型的无序集合,集合成员是唯一的。

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

      1. sadd key member1 [member2] 添加成员
      2. scard key       获取成员数
      3. sdiff key [key2]     返回给定所有集合的差集
      4. sdiffstore destination key1 [key2] 返回给定集合的差集并存储在destination中;
      5. sinter key1 [key2] 返回给定集合的交集;
      6. sinterstore destination key1 [key2]
      7. sismember key member 判断member是否集合key的成员;
      8. smembers key 返回集合所有成员;
      9. smove source destintion member   将member元素从source移动到destination
      10. spop key 随机移除并返回key中一个元素;
      11. srandmember key [count] 随机返回集合中一个或多个元素
      12. srem key member1 [member2] 移除集合中一个或多个成员;
      13. sunion key1 [key2] 返回给定集合的并集
      14. sunionstore destination key1 [key2]
      15. sscan key cursor [match pattern] [count count]

      5.6.    sorted set

      Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

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

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

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

      1

      ZADD key score1 member1 [score2 member2] 
      向有序集合添加一个或多个成员,或者更新已存在成员的分数

      2

      ZCARD key 
      获取有序集合的成员数

      3

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

      4

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

      5

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

      6

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

      7

      ZRANGE key start stop [WITHSCORES] 
      通过索引区间返回有序集合成指定区间内的成员

      8

      ZRANGEBYLEX key min max [LIMIT offset count] 
      通过字典区间返回有序集合的成员

      9

      ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 
      通过分数返回有序集合指定区间内的成员

      10

      ZRANK key member 
      返回有序集合中指定成员的索引

      11

      ZREM key member [member ...] 
      移除有序集合中的一个或多个成员

      12

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

      13

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

      14

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

      15

      ZREVRANGE key start stop [WITHSCORES] 
      返回有序集中指定区间内的成员,通过索引,分数从高到底

      16

      ZREVRANGEBYSCORE key max min [WITHSCORES] 
      返回有序集中指定分数区间内的成员,分数从高到低排序

      17

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

      18

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

      19

      ZUNIONSTORE destination numkeys key [key ...] 
      计算给定的一个或多个有序集的并集,并存储在新的 key 中

      20

      ZSCAN key cursor [MATCH pattern] [COUNT count] 
      迭代有序集合中的元素(包括元素成员和元素分值)

       

       

       

       

      附录

      6.      其它

      6.1.    redis与memcached的区别

      1. redis与 memcached相比,redis支持key-value数据类型,同事支持list、set、hash等数据结构的存储。
      2. redis支持数据的备份,即master-slave模式的数据备份。
      3. redis支持数据的持久化。
      4. redis在很多方面支持数据库的特性,可以这样说他就是一个数据库系统,而memcached只是简单地K/V缓存。
      5. 它们在性能方面差别不是很大,读取方面尤其是针对批量读取性能方面memcached占据优势。当然redis也有他的优点,如持久性、支持更多的数据结构。
      6. 所以在选择方面如果有持久方面的需求或对数据类型和处理有要求的应该选择redis。
      7. 如果简单的key/value 存储应该选择memcached。