为什么使用redis、redis 和 memcached 的区别、redis支持的数据类型

1、为什么用redis

使用redis缓存,主要是为了解决两个问题:高性能和高并发

(1)高性能 

如果不使用缓存的话,对于一些需要后台程序经过复杂的计算、且返回的数据相对稳定(不经常变化)、大量用户频繁访问的请求,对于这种类型请求的处理将会是十分低效的。既然数据相对稳定,变化很少,为什么每次请求的时候都要单独去查询呢?把之前已经查询出来的结果单独保存起来,获取的时候不用再去复杂的查询而是直接返回给你岂不更准更快?既然大量用户频繁访问,如果每个用户都去复杂查询,对系统将会产生巨大的访问压力,而且系统处理的效率也会降低。

所以,鉴于以上不使用缓存的低效,redis缓存能够很大的提高服务器的性能。之前已经查询出来的数据直接放入缓存,有用户请求数据时候,直接拿来主义,不用自己费周折去查询,直接从缓存中取数据,十分高效。

(2)高并发

对于关系型数据库,服务器能够同时处理的并发请求量有限,比如mysql 单机支撑到 2000QPS就容易报警了。所以,对于每秒钟达到上万、几十万的请求,关系型数据库很难支撑。此时,使用redis缓存可以解决这个问题,redis单机支撑的并发量轻松达到每秒几万、十几万,可以很好的支撑高并发环境下系统的运行。

 

2、redis 和 memcached 的区别

(1)对数据类型的支持

redis 支持丰富的数据结构,String,list,map,set,sorted set等。redis 相比 memcached 来说,拥有更多的数据类型,能支持更丰富的数据操作。如果需要通过缓存来支持复杂的数据结构和操作, redis 是很好的选择。

(2)对集群的支持

redis在 redis3.x 版本中便能支持cluster模式,而 memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。

(3)性能对比

由于 redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis。虽然 redis 也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。

 

3、redis支持的数据类型

redis 主要有以下几种数据类型:

string、hash、list、set和sorted set

(1)string

这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。还可以通过exists来判断是否存在某个键值、通过del来删除键值对。还可以批量设置键值对和批量获取键值对。批量设置:mset key1 value1 key2 value2 key3 value3,批量获取:mget key1 key2 key3。

(2)hash

语法:hset [field] [key] [ value]

           hget [fielld] [key]

(3)list

语法:

          lpush [list] value1[value....]:将一个或多个值插入到列表头部

          lpop [list]:删除列表头部数值

          lrange [list] [start] [end]:获取指定范围的数据,比如全部数据:lrange mylist  0  -1;

          rpop [list]:删除列表尾部数值

list 是有序列表,多种用途,比如可以通过 list 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西。也可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询,这个是很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。

# 0开始位置,-1结束位置,结束位置为-1时,表示列表的最后一个位置,即查看所有。
lrange mylist 0 -1

比如可以搞个简单的消息队列,从 list 头怼进去,从 list 尾巴那里弄出来。

(4)set

set 是无序集合,自动去重。直接基于 set 将系统里需要去重的数据扔进去,自动就给去重了,如果需要对一些数据进行快速的全局去重,你当然也可以基于 jvm 内存里的 HashSet 进行去重,但是如果你的某个系统部署在多台机器上呢?得基于 redis 进行全局的 set 去重。可以基于 set 处理交集、并集、差集的操作,比如交集,可以把两个人的粉丝列表整一个交集,看看俩人的共同好友是谁。把两个大 V 的粉丝都放在两个 set 中,对两个 set 做交集。

#-------操作一个set-------
# 添加元素
sadd mySet 1

# 查看全部元素
smembers mySet

# 判断是否包含某个值
sismember mySet 3

# 删除某个/些元素
srem mySet 1
srem mySet 2 4

# 查看元素个数
scard mySet

# 随机删除一个元素
spop mySet

#-------操作多个set-------
# 将一个set的元素移动到另外一个set
smove yourSet mySet 2

# 求两set的交集
sinter yourSet mySet

# 求两set的并集
sunion yourSet mySet

# 求在yourSet中而不在mySet中的元素
sdiff yourSet mySet

(5)sorted set

sorted set 是排序的 set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。

zadd board 85 zhangsan
zadd board 72 lisi
zadd board 96 wangwu
zadd board 63 zhaoliu

# 获取排名前三的用户(默认是升序,所以需要 rev 改为降序)
zrevrange board 0 3

# 获取某用户的排名
zrank board zhaoliu

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值