借助Redis实现高效校验
随着互联网的快速发展,互联网应用越来越普及。在这个过程中,要保证用户的账户安全,就必须进行身份校验。传统的身份校验方式,常常采用数据库来存储用户信息和凭证。但是,传统方式存在一些问题。比如,当get="_blank">访问量很大的时候,数据库的性能和效率容易受到影响。而使用Redis来辅助数据库来存储用户信息,可以很好的解决这些问题。本文就介绍如何借助Redis来实现高效的身份校验。
一、Redis的介绍
Redis是一个开源的高性能的key-value存储系统,具有以下特点:
1、速度快:Redis的性能非常高,因为它所有数据都是放在内存中处理的。而且,Redis的底层是基于C语言实现的,所以它的性能非常出色。据测试,一台配置良好的 服务器 ,可以达到10万的请求速度。
2、存储结构简单:Redis的数据结构非常简单,只有五种;而且这些数据结构不仅可以单独使用,也可以相互组合使用。在实际应用中,这些特性可以非常灵活地满足各种需求。

3、支持多种数据结构:Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。这些数据结构的灵活组合,可以满足各种复杂的应用场景。
二、Redis用作缓存
在实际应用中,Redis最常见的使用方式就是作为缓存。因为Redis的读写性能非常高,并且可以支持高并发场景。使用Redis作为缓存系统的优点如下:
1、减轻数据库压力:缓存系统可以将一部分数据缓存到内存中,通过快速读取内存中的数据来减轻数据库的压力。
2、提高读写性能:缓存系统可以利用内存快速读写数据,因此可以提高读写性能。
3、提高并发能力:缓存系统支持高并发操作,可以支持多个应用同时读写数据,提高系统的并发能力。
三、使用Redis实现身份校验
Redis的高速读写能力和支持高并发的特性,可以很好的辅助数据库来存储用户信息和凭证。下面,我们就来演示如何使用Redis来实现身份校验。
1、身份校验流程
身份校验流程如下图所示。
我们需要在pom.xml文件中引用Redis的jar包。
redis.clientsjedis2.9.0
2)然后,我们定义一个RedisUtil类,用来进行Redis的一些操作。
public class RedisUtil {private static JedisPool pool;static {JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(1000); // 最大连接数config.setMaxIdle(100); // 最大空闲数config.setMaxWtMillis(3000); // 获取连接的最大等待时间pool = new JedisPool(config, "localhost", 6379); // Redis服务器ip和端口号}public static Jedis getResource() {return pool.getResource();}public static void returnResource(Jedis jedis) {pool.returnResourceObject(jedis);}}
3)接下来,我们定义一个TokenUtil类,用来进行身份的校验和生成。
public class TokenUtil {public static String createToken(String name, String password) {String token = UUID.randomUUID().toString().replaceAll("-","");try {Jedis jedis = RedisUtil.getResource();jedis.set(token, name + ":" + password);jedis.expire(token, 7200); // 设置过期时间为2小时RedisUtil.returnResource(jedis);} catch (Exception e) {e.printStackTrace();}return token;}public static boolean checkToken(String token) {try {Jedis jedis = RedisUtil.getResource();if (jedis.exists(token)) {String value = jedis.get(token);String[] array = value.split(":");String name = array[0];String password = array[1];jedis.expire(token, 7200); // 更新过期时间RedisUtil.returnResource(jedis);return true;}RedisUtil.returnResource(jedis);} catch (Exception e) {e.printStackTrace();}return false;}}
4)我们在用户登录时调用createToken方法生成token,在需要进行身份校验时调用checkToken方法来校验token是否合法。
public class UserController {@RequestMapping(value = "/login", method = RequestMethod.POST)public String login(HttpServletRequest request, @RequestParam String name, @RequestParam String password) {// 省略部分代码String token = TokenUtil.createToken(name, password);Cookie cookie = new Cookie("token", token);cookie.setPath("/");cookie.setMaxAge(7200); // 设置cookie过期时间response.addCookie(cookie);return "index";}@RequestMapping(value = "/user", method = RequestMethod.GET)public String user(HttpServletRequest request) {String token = null;Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("token".equals(cookie.getName())) {token = cookie.getValue();break;}}}if (token != null && TokenUtil.checkToken(token)) {// 访问成功return "user";} else {// 访问失败return "login";}}}
四、总结
Redis作为一个高性能的缓存系统,可以很好的辅助数据库来存储用户信息和凭证,并解决了传统方式下的一些性能和效率问题。使用Redis来实现身份校验,不仅可以提高系统并发能力,也可以保护用户隐私信息的安全。因此,Redis已经成为互联网应用开发中不可或缺的一部分。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
查看redis数据库实例对应的配置文件。
查看redis数据库实例对应的配置文件执行 ps -ef | grep redis-server ,确定redis的安装目录,一般配置文件都是 安装目录/etc/ ;
Redis有哪些数据结构?
Redis有五种结构:1、String可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作。 字符串命令:①get、获取存储在指定键中的值②set、设置存储在指定键中的值③del、删除存储在指定键中的值(这个命令可以用于所有的类型)2、list一个链表,链表上的每个节点都包含了一个字符串,虫链表的两端推入或者弹出元素,根据偏移量对链表进行修剪(trim),读取单个或者多个元素,根据值查找或者移除元素。 列表命令:①rpush、将给定值推入列表的右端②lrange、获取列表在指定范围上的所有值③lindex、获取列表在指定范围上的单个元素④lpop、从列表的左端弹出一个值,并返回被弹出的值3、set包含字符串的无序收集器(unordered collection)、并且被包含的每个字符串都是独一无二的。 添加,获取,移除单个元素,检查一个元素是否存在于集合中,计算交集,并集,差集,从集合里面随机获取元素。 集合命令:①sadd、将给定元素添加到集合②smembers、返回集合包含的所有元素③sismember、检查指定元素是否存在于集合中④srem、检查指定元素是否存在于集合中,那么移除这个元素4、hash包含键值对无序散列表,添加,获取,移除当键值对,获取所有键值对。 散列命令:①hset、在散列里面关联起指定的键值对②hget、获取指定散列键的值③hgetall、获取散列包含的所有键值对④hdel、如果给定键存在于散列里面,那么移除这个键5、zset字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。 添加,获取,删除单个元素,根据分值范围(range)或者成员来获取元素。 有序集合命令:①zadd、将一个带有给定分值的成员添加到有序集合里面②zrange、根据元素在有序排列中所处的位置,从有序集合里面获取多个元素③zrangebyscore、获取有序集合在给定分值范围内的所有元素④zrem、如果指定成员存在于有序集合中,那么移除这个成员
如何通过java对redis进行性能测速
redis是一个key-value存储系统。 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。 在此基础上,redis支持各种不同方式的排序。 与memcached一样,为了保证效率,数据都是缓存在内存中。 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。 它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1] Redis支持主从同步。 数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。 这使得Redis可执行单层树复制。 存盘可以有意无意的对数据进行写操作。 由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。 同步对读取操作的可扩展性和数据冗余很有帮助。 redis的官网地址,非常好记,是。 (特意查了一下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)目前,Vmware在资助着redis项目的开发和维护。
发表评论