redis基础知识

2020-01-16  本文已影响0人  bug去无踪

redis数据库连接:redis-cli -h 主机IP -a 登录密码
例如:redis-cli -h 127.0.0.1 -a test

查看redis进程ID
ps | grep redis

1.Redis的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)等多种数据结构组成

2.支持数据持久化

3.支持数据备份

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

5.五种数据类型
类型 简介 特性 场景
5.1 String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M ---

5.2 Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性

5.3 List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1.最新消息排行等功能(比如朋友圈的时间线) 2.消息队列

5.4 Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐

5.5 Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进

6.key
DEL key(删除key)
EXISTS key (key是否存在)
EXPIRE key time(过期时间 单位秒)
EXPIREAT key time (到什么时候过期)
PEXPIRE key time(过期时间 单位毫秒)
PEXPIREAT key time(到什么时候过期 单位毫秒)
keys XXX*(查找符合条件的key)
MOVE key db (将key移动到另一个缓存数据库)
type key(返回key所存储的值的类型)

7.set
Set key value (设置指定的key的值)
get key (获取指定key的值)
GETSET key value (设置新值返回旧值)
MGET keys1 key2 ....获取一组key的值
SETEX key timeout value (设置key的值为并且设置过期时间)
MSET key1 value1 key2 value2...(设置多个key-value的值)
MSETNX key1 value1 key2 value2...(设置多个key-value的值,当且仅当所有给定的key都不存在时)
PSETEX key milliseconds value(设置key的值为并且设置过期时间 毫秒为单位)
INCR key key中的数字值增一
INCRBY key increment key所存的值加上指定的增量值
DECR key中的数字值减少一
DECRBY key decrement key所存的值减去指定的减量值
APPEnd KEY Value key是一个字符串,追加value到原来的值末尾

8.Hash key也可以理解为table filed1理解为key value 个人理解
HDEL key filed1 filed2.... 删除一个或多个哈希表字段
HEXISTS key filed 查看哈希表中指定的filed是否存在
HGET key filed 获取哈希表中指定字段的值
HGETALL key 获取哈希表中所有的字段和值
HINCRBY key filed increment 为哈希表 key 中的指定字段的整数值加上增量 increment
HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment
HKEYS key 获取所有哈希表中的字段
HLEN key 获取哈希表中字段的数量
HMGET key filed1 filed2 .... 获取所有给定字段的值
HMSET key filed1 value1 filed2 values2 ... 同时将多个filed-value设置到哈希表中
HSET key filed value 将哈希表 key 中的字段 field 的值设为 value
HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
HVALS key 获取哈希表中所有值

9.List (双向链表)

BLPOP key1 [key2] timeout :移出并获取列表的第一个元素 (从链表左边取元素) 可以阻塞
BRPOP key1 [key2] timeout :移出并获取列表的最后一个元素 (从链表右边取元素) 可以阻塞
BRPOPLPUSH source destination timeout :从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它
LINDEX key index 通过索引获取列表中的元素
LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素
LLEN key 获取列表长度
LPOP key 移出并获取列表第一个元素
LPUSH key value1 ... 将一个或多个值插入到列表头部
LPUSHX key value 将一个值插入到已存在的列表头部
LRANGE key start stop 获取列表指定范围内的元素
LREM key count value 移除列表元素
LSET key index value 通过索引设置列表元素的值
LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
RPOP key 移除列表的最好一个元素,返回值为移除的元素
RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPUSH key value1 value2 在列表中添加一个或多个值
RRPUSH key value为已存在的列表添加值

10.SET
SADD key member1 member2 向一个集合添加一个或多个成员
SCARD key 获取集合的成员数
SDIFF key1 key2 返回给定集合的差集 在集合key1里面不在集合key2里面元素
SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
SINTER key1 key2 返回两个集合的交集
SINTERSTORE destination key1 key2 返回两个集合的交集并存储在destination中
SISMEMBER key member 判断member元素是否是集合key的成员
SMEMBERS key 返回集合的成员
SMOVE source destination member 将member元素从source集合移动到destination
SPOP key 移除并返回集合中的一个随机元素
SRANDMEMBER key count 返回集合一个或多个随机数 count:表示个数
SREM key member1 member2 移除集合中一个或多个成员
SUNION key1 key2 返回所有给定集合的并集
SUNIONSTORE destination key1 key2 返回所有给定集合的并集并存储在destination集合中
SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素

11.sorted set
ZADD key score1 members score2 member2:向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key 获取有序集合的成员数
ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
ZINTERSTORRE destination numkeys key 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key中
ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
ZRANGE key start stop WITHSCORES 通过索引区间返回有序集合指定区间内的成员
ZRANGEBYLEX key min max [limit offset count] 通过索引区间返回有序集合指定区间内的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
ZRANK key member 返回有序集合中指定成员的索引
ZREM key member [member...]移除有序集合中的一个或多个成员
ZREMRANGGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCORE key member 返回有序集中,成员的分数值
ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值

12.高并发情况下使用redis缓存注意的问题

12.1缓存穿透: 频繁查询一个不存在的缓存
解决方案(设置空值到缓存,短时间过期 运维在nginx配置中限制单个ip每秒访问次数超出拉黑ip 拦截校验非法参数 布隆过滤器 利用互斥锁)

利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试(穿透)

12.2 缓存雪崩 :缓存集中到某一个时间过期,
根据缓存的热度设置不同的过期时间 (解决方案:过期时间加一个随机值的短时间)

12.3 缓存击穿 :某一个key非常热点,过期时大并发查询穿破缓存,直接查询数据库
设置永不过期(解决:key永不过期 或者加互斥锁)

13.主从备份缓存

持久化方式 RDB(半持久化)、 AOF(全持久化)
目的: 防止缓存奔溃,及时恢复

13.1.RDB: 对redis中的数据执行周期性周期性持久化,隔一段时间存储
当满足条件时,redis需要执行RDB的时候服务器会执行以下操作:
(1).redis调用系统的fork()函数创建一个子进程
(2).子进程将数据集写入一个临时的RDB文件
(3).当子进程完成对临时的RDB文件的写入时,redis用新的RDB文件来替换原来旧的RDB文件,并将旧的RDB文件删除

优点:生成多个文件,每个文件都代表了某一时刻中redis的数据;RDB对redis对外提供读写服务的时候,影像非常小,因为redis 主进程只需要fork一个子进程出来让子进程对磁盘io来进行rdb持久化;RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快

缺点:在时间间隔内服务挂了会丢失部分数据;RDB每次fork出子进程来执行RDB快照生成文件时,如果文件特别大,可能会导致客户端提供服务暂停数毫秒或者几秒

13.2 AOF:存放每条写命令的,所以会不断的增大,当大到一定程度时,AOF会做rewrite操作,rewrite操作就是基于当时redis的数据重新构造一个小的AOF文件,然后将大的AOF文件删除。

优点:
(1)更好的保护数据不丢失,通过后台的一个线程去执行一次fsync操作,如果redis挂掉,最多丢失1秒的数据
(2)AOF以appen-only的模式写入,所以没有任何磁盘寻址的开销,写入性能非常高。
(3)AOF日志文件的命令通过非常可读的方式进行记录,这个非常适合做灾难性的误删除紧急恢复,如果某人不小心用 flushall命令清空了所有数据,只要这个时候还没有执行rewrite,那么就可以将日志文件中的flushall删除,进行恢复。

缺点:对于同一份文件AOF文件比RDB数据快照要大;AOF开启后支持写的QPS会比RDB支持的写的QPS低,因为AOF一般会配置成每秒fsync操作,每秒的fsync操作还是很高的;数据恢复比较慢,不适合做冷备

如果同时使用RDB和AOF两种持久化机制,那么redis重启的时候,会使用AOF来构建数据,因为AOF的数据更加完整。

14.redis为什么这么快?
14.1 完全基于内存,绝大部分请求都是纯粹的内存操作,非常快速,查找和操作的时间复杂度都是

14.2 数据结构简单,对数据操作简单(string hash list set zset)

14.3 采用单线程,避免了不必要的上下文切换和资源竞争,也不存在多进程或者多线程导致的切换而消耗cpu,不用考虑锁以及锁带来的性能消耗

14.4 使用多路i/o复用模型,非阻塞i/o

上一篇下一篇

猜你喜欢

热点阅读