redis数据库相关内容

mysql和redis的区别
(1)mysql和redis的数据库类型
mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。
redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大地提高运行效率,但是保存时间有限。
(2)从作用上来说,mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢;
redis用于存储使用较为频繁的数据到缓存中,读取速度快,这样减少访问数据库的次数,提高运行效率。
缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会在缓存中进行查找,如果存在,就获取;否则就访问数据库。缓存的好处就是读取速度快。

参考:https://www.runoob.com/redis/redis-tutorial.html
Redis(REmote DIctionary Server) 是完全开源免费的,是一个key-value存储系统。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
redis是单线程模型的内存级别缓存字典服务数据库,非关系型数据库,读取存取速度快,天生能保证数据的一致性,但不需持久化、存储内存有限。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势:
性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型:Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子:Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性:Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

redis缓存雪崩是指缓存层出现了错误,不能正常工作了。于是所有的请求都会到达存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。
现象:大量key同一时间点失效,同时又有大量请求打进来,导致流量直接打在DB上,造成DB不可用。
一个雪崩的简单过程:
(1)redis集群大面积故障;
(2)缓存失效,但依然大量请求访问缓存服务redis;
(3)redis大量失效后,大量请求转向到mysql数据库;
(4)mysql的调用量暴增,很快就扛不住了,甚至直接宕机;
(5)由于大量的应用服务依赖mysql和redis的服务,这个时候很快会演变成各服务器集群的雪崩,最后网站彻底崩溃。

在这里插入图片描述
解决方案:
(1)redis缓存高可用
缓存层设计成高可用,防止缓存大面积故障。即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。
(2)缓存限流降级
可以利用ehcache等本地缓存(暂时支持),但主要还是对源服务访问进行限流、资源隔离(熔断)、降级等。当访问量剧增、服务出现问题仍然需要保证服务还是可用的。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级,这里会涉及到运维的配合。降级的最终目的是保证核心服务可用,即使是有损的。在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
(3)Redis备份和快速预热
在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

缓存穿透: 指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案: 最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

redis缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

缓存并发指的是多个redis的client同时set key引起的并发问题。其实redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。当然另外的解决方案是把redis.set操作放在队列中使其串行化,必须一个一个执行。

安装redis命令: sudo apt-get install redis-server
查询redis是否安装成功命令: ps -aux|grep redis
启动redis服务器命令:redis-cli

$ redis-cli
127.0.0.1:6379>
127.0.0.1:6379> PING
PONG
我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。 

Redis 数据类型:
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
(1)String(字符串): string 是 redis 最基本的数据类型,一个 key 对应一个 value。string 类型的值最大能存储 512MB。 string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。

127.0.0.1:6379> set name zzz
OK
127.0.0.1:6379> get name
"zzz"
设置失效时间:set name zzz ex 20
我们使用了 Redis 的 set 和 get 命令,键为name
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> clear
del name 用于删除前面测试用过的 key,不然会报错:(error) WRONGTYPE Operation against a key holding the wrong kind of value
del是一个命令, name是一个键。 如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0

(2)Hash(哈希): Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

127.0.0.1:6379> hset li guo cheng
(integer) 1
127.0.0.1:6379> hset li jian jie
(integer) 1
127.0.0.1:6379> hget li
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hget li jian
"jie"
在以上实例中我们使用了 Redis 的 hset 和 hget 命令,键为li。


127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
OK
127.0.0.1:6379>  HGET runoob field1
"Hello"
127.0.0.1:6379> HGET runoob field2
"World"
我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value, HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。

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

127.0.0.1:6379> lpush runoob aaa
(integer) 1
127.0.0.1:6379> lpush runoob bbb
(integer) 2
127.0.0.1:6379> lpush runoob ccc
(integer) 3
127.0.0.1:6379> lrange runoob 0 10
1) "ccc"
2) "bbb"
3) "aaa"


127.0.0.1:6379> lpush li guo cheng haha xixi heihei
(integer) 5
127.0.0.1:6379> lrange li 0 3
1) "heihei"
2) "xixi"
3) "haha"
4) "cheng"
127.0.0.1:6379> lpop li
"heihei"
127.0.0.1:6379> lrange li 0 3
1) "xixi"
2) "haha"
3) "cheng"
4) "guo"

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)

(4)Set(集合): Redis 的 Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

sadd 命令: 添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0。
sadd key member

127.0.0.1:6379> sadd runoob aaa
(integer) 1
127.0.0.1:6379> sadd runoob bbb
(integer) 1
127.0.0.1:6379> sadd runoob ccc
(integer) 1
127.0.0.1:6379> sadd runoob ccc
(integer) 0
127.0.0.1:6379> scard runoob
(integer) 3
127.0.0.1:6379> smembers runoob
1) "ccc"
2) "bbb"
3) "aaa"
127.0.0.1:6379> spop runoob
"aaa"
127.0.0.1:6379> smembers runoob
1) "ccc"
2) "bbb"
注意:以上实例中ccc添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。 

(4) zset (sorted set:有序集合): Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。

zadd 命令:添加元素到集合,元素在集合中存在则更新对应score
zadd key score member 

127.0.0.1:6379> zadd runoob 0 aaa
(integer) 1
127.0.0.1:6379> zadd runoob 0 bbb
(integer) 1
127.0.0.1:6379> zadd runoob 0 ccc
(integer) 1
127.0.0.1:6379> zrange runoob 0 -1
1) "aaa"
2) "bbb"
3) "ccc"
127.0.0.1:6379> zrange runoob 0 1
1) "aaa"
2) "bbb"

各个数据类型应用场景:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值