Redis 存用户信息

本文详述了使用session进行用户登录验证的过程,包括如何将用户信息存储于session及从session中检索登录用户对象的方法。同时,针对session在多服务器环境下的局限性,提出了利用Redis存储登录信息以支持负载均衡的解决方案。

用session的情况

登录流程

  • 用户输入用户名和密码,传到后台,后台去数据库查询,如果用户名和密码都正确,就会把查询出来的当前用户对象存到session.
  • 用户已经登录成功,访问其他页面,比如查询自己的成绩,那么需要知道登录用户的id才能到数据库成绩表查询, 这个用户id就可以直接通过session获取。
  • 如何拿sesion里面的登录用户对象? HttpServletRequest req.getSession(). session的数据是存在服务器,但是浏览器里面存了session id. 这个session id 可以保证每个不同的浏览器(客户端),在服务器端都可以拿到自己的那个session,从而不同的人,同时登录系统,服务器端都可以区分不同人各自的登录信息。

缺点

  • 只能是一个服务器,如果有多个服务器同时负载均衡的话,有可能拿不到登录信息。 因为登录的时候数据存A服务器,可能后面查成绩的时候,请求到了B服务器,但是B服务器里面没有登录信息的session.

Redis 存登录信息

如果登录信息,存在Redis里面就可以支持多个服务器的负载均衡了。

  • Redis 存的格式是key,value, key是一个唯一的字符串, value是 登录用户的user对象
  • 这个key ,一定是从前端传过来的
  • key的值,有很多方式,但是必须保证唯一,最简单的,可以直接是user对象的id. 一般的做法是id就一个时间戳,再加密一次。组成一个唯一的字符串。
  • 这个key的字符串,一般会放在 每次 请求的head里面

Redis还可以用于缓存

比如商品信息,可以把数据缓存到Redis,因为商品的变动频率很小,
用户浏览商品的时候,直接返回redis里面的数据,会更加快速。
但是如果查询某个商品,redis里面没有,就必须到数据库里面再查一次,如果查到了,就返回页面同时把这个数据存到redis里面。

  • redis里面可以设置数据的有效时间,来定时更新redis里面的缓存数据。
  • 如果用户直接修改了数据库,可以通过mysql的触发器去更新数据到redis缓存

关注公众号,可以获取学习资料和源码

在这里插入图片描述

<think>好的,用户想了解如何使用Redis储数据,特别是示例和教程。我需要先回忆一下Redis的基本数据结构,因为不同的数据结构有不同的应用场景和命令。 首先,Redis有五种基本数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)。用户提到的问题可能需要分别介绍这些结构的用法,并给出示例。 用户提供的引用中提到了哈希结构,特别是引用[2]详细说明了Hash的特点和命令。这可能是用户关心的部分,但也要确保覆盖其他数据结构,以便全面回答。 接下来,我需要考虑如何组织回答的结构。通常,分步骤或分数据结构来讲解会更清晰。每个数据结构可以包括特点、常用命令和示例代码。示例代码部分使用Python,因为用户之前的示例是Python,可能更熟悉。 需要确保示例代码正确,比如连接Redis的库是redis-py,命令对应正确。比如,字符串的set和get,哈希的hset和hget等。同时,要强调实际应用中的最佳实践,比如使用连接池、异常处理等,但用户可能更需要基础示例,所以这部分可能在最后作为注意事项。 另外,用户可能想知道如何选择合适的数据结构。比如,哈希适合储对象,列表适合队列,集合适合唯一元素储。这部分可以作为每个数据结构的小结,帮助用户理解何时使用哪种结构。 还要注意引用格式,在回答中引用相关部分,比如哈希的特点来自引用[2],需要正确标注。同时,生成相关问题,可能涉及数据结构选择、性能优化、实际应用场景等。 需要检查LaTeX格式是否正确,比如行内公式用$...$,独立公式用$$...$$,但这个问题可能涉及较少数学公式,主要关注代码和命令示例。不过如果有涉及比如内优化时的计算,可能需要公式,但可能不需要,所以暂时可以不考虑。 最后,确保回答用中文,结构清晰,分点说明,代码示例正确,并自然添加引用标记。生成的相关问题要围绕Redis数据储的扩展,比如不同结构的比较、持久化配置、性能优化等。</think>### 如何用 Redis 储数据:示例与教程 Redis 是一款高性能的键值储数据库,支持多种数据结构。以下是基于其核心数据结构的储方法及示例: --- #### 一、字符串(String) **特点**:储单个值(文本、数字、序列化对象),适合简单键值对场景。 **常用命令**: - `SET key value`:储值 - `GET key`:获取值 - `INCR key`:原子递增 **Python 示例**: ```python import redis # 连接 Redis r = redis.Redis(host='localhost', port=6379, db=0) # 储字符串 r.set("user:1001:name", "Alice") print(r.get("user:1001:name")) # 输出: b'Alice' # 储数值并递增 r.set("counter", 10) r.incr("counter") print(r.get("counter")) # 输出: b'11' ``` --- #### 二、哈希(Hash) **特点**:储字段-值对,适合对象属性(如用户信息)[^2]。 **常用命令**: - `HSET key field value`:设置字段值 - `HGET key field`:获取字段值 - `HGETALL key`:获取所有字段和值 **Python 示例**: ```python # 储用户对象 r.hset("user:1002", "name", "Bob") r.hset("user:1002", "age", 25) print(r.hgetall("user:1002")) # 输出: {b'name': b'Bob', b'age': b'25'} ``` --- #### 三、列表(List) **特点**:有序元素集合,支持双向插入/删除,适用于队列或历史记录。 **常用命令**: - `LPUSH key value`:左侧插入元素 - `RPOP key`:右侧弹出元素 - `LRANGE key start end`:获取范围元素 **Python 示例**: ```python # 实现消息队列 r.lpush("task_queue", "task1") r.lpush("task_queue", "task2") task = r.rpop("task_queue") print(task) # 输出: b'task1' ``` --- #### 四、集合(Set) **特点**:无序唯一元素集合,适用于去重或交集/并集运算。 **常用命令**: - `SADD key member`:添加成员 - `SMEMBERS key`:获取所有成员 - `SINTER key1 key2`:求交集 **Python 示例**: ```python # 储标签 r.sadd("article:2001:tags", "tech") r.sadd("article:2001:tags", "redis") print(r.smembers("article:2001:tags")) # 输出: {b'tech', b'redis'} ``` --- #### 五、有序集合(Sorted Set) **特点**:元素按分数排序,适用于排行榜或优先级队列。 **常用命令**: - `ZADD key score member`:添加带分数的成员 - `ZRANGE key start end`:按分数升序获取成员 **Python 示例**: ```python # 储排行榜 r.zadd("leaderboard", {"Alice": 100, "Bob": 90}) print(r.zrange("leaderboard", 0, -1, withscores=True)) # 输出: [(b'Bob', 90.0), (b'Alice', 100.0)] ``` --- ### 注意事项 1. **连接池优化**:生产环境建议使用 `ConnectionPool` 管理连接。 2. **数据持久化**:通过配置文件启用 RDB 或 AOF 防止数据丢失。 3. **键命名规范**:使用 `类型:id:字段`(如 `user:1001:name`)提高可读性。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值