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命令监视要操作的记录。开启事务监视之后,如果其它客户端想要修改监视的数据,那么事务就会自动关闭。
MULTI #开启一个事务
... #一些操作
EXEC #开启事务后所有操作都不会立即执行,直到EXEC命令发布后才会一并执行。
SET num 0
WATCH num
MULTI
INCRBY num 10
EXEC # 在执行该命令之前,若其它客户端想要修改num,那么事务就会结束
DISCARD #用于在事务提交/监视数据发生变化之前,可用该命令取消事务