redis基础

redis简介

redis与其他数据库进行对比

人们常说关系型数据库与非关系型数据库,redis不使用表,它的数据库也不会预定义或者强制要求用户对于redis存储的不同数据进行关联。

高性能键值缓存服务器memcached也经常被拿来与redis进行比较。两者的区别如下:

  • redis能够自动以两种不同的方式将数据写入硬盘,并且redis除了能够存储普通的字符串键以外,还可以存储其他的四种数据结构。
  • 这些不同之处使得redis可以解决更加广泛的问题,既可以做主数据库使用,又可以做其他存储系统的辅助数据库使用。

一些数据库和缓存的特性

使用redis的理由

使用redis而不是memcached来解决问题,不仅可以让代码变得更加简短,更加易懂维护,而且可以使代码运行速度更快。

redis数据结构简介

redisDataStruct

  • String常用的用法: set,get,del
  • list常用的用法:lpush,rpush,lpop,rpush,lrange, lindex
  • set常用的用法: sadd,sismember, smembers, srem
  • hash常用的用法:hset,hget,hgetall,hdel
  • zset常用的用法: zadd,zrange,zrangbyscore,zrem

使用redis构建文章投票功能

要进行构建一个文章投票的网站,我们首先要设置一些数值和限制条件,比如:

  • 一篇文章如果获得了至少200张支持票我们可以认为这是一篇有趣的文章
  • 加入这个网站每天发布1000篇文章,而其中的50篇符合对于有趣文章的要求,那么网站要做的就是把这50篇文章放到文章列表前100位至少一天。
  • 另外这个网站不提供反对票的功能

使用hash结构进行存储文章信息

article hash
title xxx
link xxx
time xxx
vote xxx

我们的文章投票网站将使用两个有序集合来存储文章:
第一个有序集合的成员是文章ID,分值为文章发布时间
第二个有序集合的成员是文章id,而分值是文章的评分

为了防止用户对于同一篇文章进行多次投票,网站需要为每篇文章记录一个已经投票用户名单。程序需要为每篇文章创建一个集合,并且使用这个集合来存储所有已经投票用户的ID

同时为了节约内存,我们进行规定当一篇文章发不起满足一周之后,用户不能够进行投票,文章的评分也会被固定下来,而记录文章已经投票用户名单的集合也会被删除。

实现的逻辑是,当用户尝试对于文章进行投票时,程序需要使用zscore命令检查文章是否发布时间未超过一周,如果文章仍然处于投票范围之内的话,那么可以使用sadd尝试将用户添加到已经投票的用户集合内
。如果添加成功,程序将使用zincrby将文章的评分添加432,并且使用hincrby命令对于散列记录的文章数量进行更新。

使用redis构建web应用

从更高层次的角度来说,web应用就是通过http协议对于网页浏览器发送的请求进行响应的服务器或者服务。一个web服务器对请求进行响应的典型的步骤如下。

  1. 服务器对于客户端发来的请求进行解析。
  2. 请求被转发给一个预定义的处理器。
  3. 处理器可能会从数据库中取出数据。
  4. 处理器根据去除的数据模版进行渲染。
  5. 处理器向客户端返回渲染后的内容作为请求的响应

在以上列举的步骤从高层次的角度展示了典型web服务器的运作方式,这种情况下web请求被认为是无状态的,也就是说服务器本身不会记录与过往请求相关的任何信息。

登陆和cookie缓存

每当我们登陆互联网服务的时候,这些服务会使用cookie来进行记录我们的的身份,cookie由少量的数据组成,网站要求我们的浏览器存储这些数据并且在每次服务发送请求的时候将这些数据回传给服务,对于用来登陆的cookie,有两种常见的方法可以将登陆信息存储在cookie里面,一种是签名cookie,另一种是令牌

签名cookie通常会存储用户名,可能还有用户id,以及用户最会一次登陆成功的时间,除了用户相关的信息之外,签名cookie还包含了一个签名,服务器可以使用这个签名来验证浏览器发送的信息是否未经改动。

令牌cookie会在cookie里面存储一串随机子串作为令牌,服务器可以根据令牌在数据库中查找令牌的拥有者,随着时间的推移,旧令牌会被新的令牌取代。

1
2
def check_token(conn, token)
return conn.hget('login', token)

对令牌的进行检查并不困难,因为大部分困难的实在更新令牌时候完成的,用户浏览页面的时候,程序都会对于用户存储在登陆散列项目里面的信息进行更新,并将用户的令牌和当前时间戳添加到登陆用户的有序集合里面;如果用户正在浏览的是一个商品界面,那么程序还会将这个商品添加到记录这个用户浏览过的商品的有序集合里面,并在记录商品的数量超过25个小时,对这个有序集合进行修建。

1
2
3
4
5
6
7
def update_token(conn, token, user, item = None)
timestamp = time.time()
conn.hset('login', token, user)
conn.zadd('recent:'. token, timestamp)
if item:
conn.zadd('viewed' + token , item, timestamp)
conn.zremarangebyrank('viewed' + token, 0, -26);

Redis命令

字符串

在redis中字符串可以存储以下三种类型:

  1. 字符串
  2. 整数
  3. 浮点型

数据安全与性能保障

持久化选项

redis提供了两种不同的方法来将数据存储到硬盘里面。一种方法叫做快照,它可以将存在某一时刻的数据全部写入硬盘里面,另一种方法叫做只追加文件(aof),它会在执行写命令时,将被执行的鞋命令复制到硬盘里面。这两种持久化方法既可以同时使用,又可以单独使用