Redis是一个使用内存来存储数据的键值数据库,因此经常用于需要缓存数据的情况,可以缓解许多后端数据库的压力。 在本文中,我们将简要介绍 Redis 提供的功能以及可以使用的位置。
Redis官网列出了每个支持的命令,所以让我们先来看看最简单的一个
redis> set mykey "hello"redis> get mykey"hello"如前所述,Redis 是一个具有键值结构的数据库,因此最简单的设置是设置键的值,如果要检索它,可以使用 get。
redis> set mykey "10"redis> decr mykey(integer) 9redis> incr mykey(integer) 10顾名思义,它的意思是为某个键加一减一,就像在编程语言中一样
mykey++
跟mykey--
还有incrby
跟decrby
,您可以指定要添加或减少的量。
redis> hset mydata name "nick"redis> hset mydata nickname "nicknick"redis> hget mydata name"nick"H是hash的意思,所以可以访问一个值下的字段,这样就可以更多样化地使用它,比如可以定义key的规则是:post+文章id,可以存储这篇文章的点赞和回复数量等,这样就不必每次都去数据库重新查询了。
redis> sadd myset "nick"redis> sadd myset "peter"redis> sadd myset "nick"redis> scard myset(integer) 2sadd 的 s 是
set
意思是,这样set
指已了解数据结构的那个set
,其中不会有重复的内容。
redis> lpush mylist "a"redis> lpush mylist "b"redis> rpush mylist "c"redis> lrange mylist 0 -11) "b"2) "a"3) "c"redis> lset mylist 0 "d"redis> lrange mylist 0 -11) "d"2) "a"3) "c"这里的数据结构是:
list
,可以选择从左边或右边推取值,对应的命令是lpush
跟rpush
lset
它指定索引的值。
lrange
您可以打印出指定范围的值,是的此形式表示最后一个值。
Redis的好处是速度非常快,所以如果你遇到一些需要快的情况,可以考虑看看Redis能不能帮到你,这里有几个我实际用过的例子。
其实短**的原理很简单,就是在对原来的**(比如哈希算法)做了一系列的计算后,得到一个短字符串,位数或者你想决定什么符号,然后把这组对应关系存储在数据库中,当别人查询到对应的键时, 您将被重定向到相应的**。
因为它是与这个键值的一对一关系,所以它非常适合 Redis。
如果你不使用像 Redis 这样的键值缓存,你就必须每次都从数据库中查询它。 如果数据量小也好,但是当数据量变大时,时间会增加,对数据库的负担也会增加,所以我认为在数据库和逻辑层之间引入一层缓存是一个不错的选择。
实现的过程也很简单,用户加一个短**,系统计算出abc123对应如上将key=abc123, value=写入数据库,但是存储在redis中 当用户点击:abc123 this**时,去redis查看是否有这个key,重定向到对应的**如果没有,就得去数据库检查,检查后记得给redis写一份副本 如果你的数据有很多数据,而且不想花大钱准备一个大内存的redis服务器(数据库是存储在硬盘上,Redis是存储在内存中,数据库在存储成本方面会便宜很多),就可以使用Redis
expire
这个功能。
存储数据时,可以添加新数据expire time
当这个时间到了,密钥将被自动清除。 例如,短过期时间可以设置为 7 天,如果 7 天没有被任何用户访问,它将被自动删除。
这样做的好处是可以减少内存的使用量,只保留一些热数据在 Redis 中,其他不太受欢迎和不常访问的数据在数据库中,然后在访问时写入 Redis。
其实上面说的短**服务,除了缩短的功能**之外,还有一个重要的点,那就是:统计数据。 例如,Google Short** 会为您提供:访问次数、图表、使用什么设备等,这些都是 Short** 服务的核心。
如果要做这个功能,那么就要记录每一个请求,或者至少记录请求的内容(用的是什么手机,时间点,IP),这样数据才能显示给用户。
如果存在数据库,并且每次都从数据库中读取读取,则会导致一些性能问题,例如每次刷新统计页面时,都必须重新:select conut(*)from short_url where
一次,您可以捕捉到总共有多少人访问过。
记住我们提到的incr
是吗? 这不是它派上用场的地方! 您可以定义密钥的格式,例如:abc123:visit 表示对 abc123 的访问总数,然后,只要执行每个请求:incr abc123:visit
,这个键就是你想要的号码,以后从Redis中读取就行了。
除此之外,假设您想提供 重复 IP 访问的数量 ,前面提到过set
这很合适。 你可以将每个请求的 ** IP 扔到一个集合中,只要你使用它scard
你可以知道有多少重复的IP,这很方便吧?
我曾经做过一个项目,有以下要求:
中午12点对用户开放**,答完问题后会看到自己的排名(按答题时间排序),只有前300名才会根据自己的排名获得奖品,然后就可以考虑需要在哪里与数据库互动。
进入**时,应先检查是否有300人以上,如果有,会提示活动结束(选择count(*),然后检查用户是否回答了问题,如果你回答了问题,则显示排名(选择..where id=..如果您还没有回答问题,将显示答案页面,并在答案完成后显示用户名(插入 ..)id=..由于本次活动只有前300名获奖者有奖品,估计如果有10,000名用户,活动可能在10秒内结束!
在 10 秒内同时对你的数据库进行如此多的查询可能会有点让人不知所措,仔细观察,你会发现有很多地方不需要用数据库来做,如果你用 Redis 来做,那就更好了!
例如,您可以像这样计划它:
使用 key:isover 存储活动是否结束,使用 account 作为键,将用户的排名存储在其中,上述过程可以改写为:
进入**时,进入redis读取isover,检查活动是否结束,检查用户是否回答了问题,查看redis用户账号的key中是否有数据,如果还没有回答问题,回答完问题,写入数据库,将排名写入redis,如果该用户的排名为>=300, 设置 isover = true 最初需要对数据库进行 3 次操作,但现在减少到只有最必要的操作,其余的都可以由 Redis 处理。而且因为Redis是一个使用内存来存储数据的数据库,所以处理速度非常快! 此外,我们没有很多密钥(只有 10,000 多个密钥),而且我们使用的内存非常少。
这样一来,在Redis的帮助下,可以顺利解决原数据库负载过重,可能速度慢甚至挂断的问题。
如果下次你有一个用户很多的项目,或者需要快速返回数据,但又担心数据库撑不住,不妨考虑一下是否可以导入 Redis,或者其他也缓存的服务。 事实上,在很多情况下,如果缓存使用得当,可以减轻很多数据库的负担,加快响应速度。