0%

redis学习(1)

Redis介绍

存储数据的方式:内存,提高数据读写速度。

在一个业务系统中,数据使用频率不同,使用频率高的被称为热数据。

结构:应用程序-缓存-数据库-HDD。

案例一:以微博为例:微博大V的数据被放到高速缓存(Redis)中,而普通人的放入NoSql中(如mongodb)。

案例二:门户网站、视频网站首页放入高速缓存中。

案列三:双十一时,电商平台要利用高速的缓存来弥补数据库吞吐能力的不足。订单先放入高速缓存集群,然后在负载低谷期时,再延时写入数据库。

Redis:Vmware开源的NoSQL数据库产品,基于Key-Value存储格式,可将数据保存在内存或硬盘中。

单线程模型的NoSQL数据库,C语言编写,QPS(每秒可查询次数)可达到100000+。

Redis提供了两种持久化的保存方案:

  • RDB:满足触发条件会将数据保存到硬盘中
  • AOF:用日志的方式来记录数据写入,倘若服务器宕机,则会在重启之后读取日志来恢复数据

类型:key一定为字符串类型,value有字符串、哈希、列表、集合和有序集合五种类型

在redis上数据的并发修改是顺序执行的

Redis参数

  • port:端口号,默认为6379

  • bind:允许的ip,默认仅允许本机访问

  • time:client空闲多少秒后关闭连接,默认0代表无限制

  • loglevel:日志级别

  • logfile:日志文件地址

  • syslog-enabled:是否将日志输出到控制台,默认为yes

  • databases:逻辑库数量,默认16

  • save:RDB文件同步的频率

  • rdbcompression:同步RDB文件是否采用压缩,默认yes

  • dbfilename:定义RDB文件名称,默认为dump.rdb

  • dir:存放RDB文件的地址

  • requirepass:访问密码,默认无密码

  • maxclients 最大连接数,默认无限制

  • maxmemory:redis占用内存的最大值

  • appendonly:开启AOF备份

  • appendfsync:AOF同步的频率,分为no|everysec|always

Redis字符串类型

String类型可保存普通文字,也可保存序列化的二进制数据(如图片)

String类型最大可存储512M数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
redis > SET email hhh@.com
redis > GET email
reids > DEL email
redis > GETRANGE email 0 3 #获取前四个字符
redis > STRLEN emai
redis > SETEX city 5 New_York #设置带有过期时间(秒)的key-value
redis > MSET city New_York name Lily #设置多个key-value
redis > MGET city name
redis > APPEND name _Queen_Country #在字符串末尾附上
redis > INCR num #数字自增1
redis > INCRBY num 25 #数字加25,可以加负数
redis > INCRBYFLOAT num 3.5 #加浮点数 可以加负数
reids > DECR num
reids > DECRBY num 10

Redis哈希类型

当我们觉得value需要保存更复杂的结构化数据时使用

与python字典类似

1
2
3
4
5
6
7
8
9
10
11
12
13
HSET 8000 her_name Lily # 一次可以向哈希表中添加一个key-value
HMSET 8000 her_name Lily age 19 hometown New_York
flushdb # 情空逻辑库中数据
HGET 8000 her_name #获取某一个字段的值
HMGET 8000 her_name hometown #获取多个字段的值
HGETALL 8000 # 获取哈希表所有key-value
HKEYS 8000 # 获取所有字段的名称
HELN 8000 # 获取字段数量
HEXISTS 8000 her_name # 验证是否存在某字段
HVALS 8000 # 获取哈希表中所有字段值
HDEL 8000 her_name #删除哈希表的字段
HINCRYBY 8000 age 1 #让哈希表某个字段加上指定值
HINCRYBYFLOAT 8000 num -0.5

Redis列表类型

当需要向VALUE保存序列化数据时使用

与python列表类似

列表允许保存重复元素

1
2
3
4
5
6
7
8
9
10
11
RPUSH blue QAQ QWQ QVQ # 右加数据
LPUSH blue ToT # 左加数据
LSET blue 2 hhh # L代表list,代表修改第三个元素
LRANGE blue 0 -1 # 输出指定范围数据,开始为0,结束为-1
LLEN blue # 获取列表长度
LINDEX blue 0 #获取列表某个元素
LINSERT blue BEFORE QWQ 233 #将233元素插到QWQ之前
LINSERT blue AFTER QWQ 666 #将666元素插到QWQ之后
LPOP blue # 删除最左侧的元素
RPOP blue # 删除最右侧的元素
LREM blue 1 QAQ # 删除1个QAQ元素

Redis集合类型

与列表类似

不允许保存重复元素

最先插入的元素可能在最后,最后的可能在最前,redis对集合中的元素按哈希值排序,哈希值小的在前,哈希值大的在后

1
2
3
4
5
6
7
SADD empno 8000 8001 # S代表set(集合),向empno中添加8000,8001这两个元素
SMEMBERS empno # 输出集合所有元素
SCARD empno # 输出元素总数
SISMEMBER empno 8000 #判断是否有8000这个元素
SREM empno 8000 8001 #删除8000,8001这两个元素
SPOP empno # 随机删除并返回集合的某个元素
SRANDMEMBER empno 5 # 随机挑选5个元素返回

Redis有序集合类型

Redis按照元素分数值排序,有编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ZADD blue 0 QAQ 0 QWQ 0 QVQ # 当都为0时,按哈希值排序
ZINCRBY blue 1 QAQ # 让QAQ这个词条分数值加一
ZCARD blue #获取有序集合的长度
ZCOUNT blue 2 4 # 查询分数区间(2,4)内的元素数量(包含2,4)
ZSCORE blue QAQ # 返回元素分数值
ZREVRANGE blue 0 -1 # Z reverse range 降序排序获取某个区间内元素 0:第一个 -1:最后一个
ZRANGE blue 0 -1 # 升序排序获取某个区间内元素
ZRANGEBYSCORE blue 5 10 #获取分数区间5到10内的集合内容
ZRANGEBYSCORE blue (5 10 #不包括5
ZRANGEBYSCORE blue 10000 +inf # 获取10000到正无穷内的
ZREVRANGEBYSCORE blue 10 5 #降序.注意最大值写在前,最小值写在后
ZRANK blue QAQ # 获取元素分数排名,升序,从0开始
ZREVRANK blue QAQ # 获取元素分数排序,降序,从0开始
ZREM blue QAQ QWQ # 删除QAQ,QWQ这两个元素
ZREMRANGEBYRANK blue 0 -1 # 删除所有元素(按排名区间)
ZREMRANGEBYSCORE blue -inf (5000 # 删除负无穷到5000的元素(按分数区间)

REDIS key操作

1
2
3
4
5
6
7
8
DEL keyword
EXISTS keyword #判断是否存在某个key,存在返回1,否则返回0
EXPIRE employee 5 # 为key设置过期时间(几秒后)
EXPIREAT employee 155555555555555 # 设置过期时间(那一天哪一分哪一秒),格式需要为UNIX时间戳
MOVE keyword 1 #记录迁移到其它数据库
RENAME hhh 233 #将key hhh 改名为 233
PERSIST keyword # 移除过期时间
TYPE keywrod # 判断value数据类型

REDIS事务

Redis的异步单线程机制决定了一个线程对应所有的客户端,不能保证当一个客户端发布多个命令时,不会被其它客户端插队

引入事物机制,来应对这个问题,Redis的事务处理机制更像是一个批处理机制,客户端一次把所有命令传递给Redis,然后Redis一次处理所有命令,等一个客户端发布的所有命令执行完之后,另一个客户端才能发布命令。

Redis 一致性,隔离性
MySQL 原子性,持久性,一致性,隔离性
  • 为了保证事务一致性,在开启事务之前必须使用WATCH命令监视要操作的记录。开启事务监视之后,如果其它客户端想要修改监视的数据,那么事务就会自动关闭。

    1
    WATCH key1 key2
  • MULTI #开启一个事务
    ... #一些操作
    EXEC #开启事务后所有操作都不会立即执行,直到EXEC命令发布后才会一并执行。
    
    1
    2
    3

    例子:

    SET num 0 WATCH num MULTI INCRBY num 10 EXEC # 在执行该命令之前,若其它客户端想要修改num,那么事务就会结束
    1

    DISCARD #用于在事务提交/监视数据发生变化之前,可用该命令取消事务