GVKun编程网logo

Golang web 开发实战之 session 缓存:如何使用 redigo 将一个结构体数据保存到 redis?

20

在本文中,我们将为您详细介绍Golangweb开发实战之session缓存:如何使用redigo将一个结构体数据保存到redis?的相关知识,此外,我们还会提供一些关于22_redis缓存配置及设置把

在本文中,我们将为您详细介绍Golang web 开发实战之 session 缓存:如何使用 redigo 将一个结构体数据保存到 redis?的相关知识,此外,我们还会提供一些关于22_redis 缓存配置及设置把 session 存储在 redis 中、django memcached/redis缓存 =====缓存session、Django Redis 存储 session 会话、django 使用 redis 存放 session的有用信息。

本文目录一览:

Golang web 开发实战之 session 缓存:如何使用 redigo 将一个结构体数据保存到 redis?

Golang web 开发实战之 session 缓存:如何使用 redigo 将一个结构体数据保存到 redis?

自定义 session 结构体:
type Session struct {
	SessionID  string        `json:"sessionId" bson:"sessionId"`
	User       *User         `json:"-" bson:"user"`
	UserType   string        `json:"userType" bson:"userType"`
	NickName   string        `json:"nickName" bson:"nickName"`
	CreateTime time.Time     `json:"-" bson:"createTime"`
	UpdateTime time.Time     `json:"-" bson:"updateTime"`
	Expires    time.Time     `json:"-" bson:"expires"`
	Locale     string        `json:"-" bson:"locale"` // default is zh_CN
	Menus      []wmodel.Menu `json:"menus" bson:"menus"`
}

使用 json.Marshal 将结构体 json 化之后保存到 redis:
/*
	【增】
	描述:向 session 哈希表中插入一个 session 对象
	session 顶级 key,顶级 key 可以设置过期时间
	<[session]: 要插入的 session 对象
	>[error]:插入失败相关信息
*/
func (s *sessionService) addSession(session *model.Session) error {
	// 从池里获取连接
	conn := pool.Get()
	if conn == nil {
		log.Errorf("redis connnection is nil")
		return errors.New("redis connnection is nil")
	}
	// 用完后将连接放回连接池
	defer conn.Close()
	// 将session转换成json数据,注意:转换后的value是一个byte数组
	value,err := json.Marshal(session)
	if err != nil {
		log.Errorf("json marshal err,%s",err)
		return err
	}
	log.Infof("send data[%s]",session.SessionID,value)
	_,err = conn.Do("SET",value)
	if err != nil {
		return err
	}

	return nil
}

Golang 测试验证:
func TestAddSession(t *testing.T) {

    s := &model.Session{
        SessionID: "20150421120000",UserType:  "admin",NickName:  "df",}

    err := sService.addSession(s)
    if err != nil {
        t.Errorf("fail to add one session(%+v): %s",s,err)
        t.FailNow()
    }
}

redis 客户端查看该 session 保存情况:


参考资料

GO: How to save and retrieve a struct to redis using redigo

22_redis 缓存配置及设置把 session 存储在 redis 中

22_redis 缓存配置及设置把 session 存储在 redis 中

django 配置 redis 缓存

1. 安装 django-redis 包

pip install -i https://pypi.douban.com/simple django-redis

2. 在 settings.py 文件中,指定 redis 缓存

# 配置redis缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",      # 使用的redis 0号数据库
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    # 下面还可以配置更多的redis缓存库, 如下:
    # 配置一个专门用来存储session的redis数据库1
    "session": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",         # 使用redis 1号数据库
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    # ...
}

3. 指定 session 的存储位置,也是在 settings.py 文件中,在 redis 缓存配置后面指定,就可以了

# 指定session缓存存储在哪里
# session存储缓存设置,        把session 存储到 redis中的 数据库1 中
SESSION_ENGINE = ''django.contrib.sessions.backends.cache''
SESSION_CACHE_ALIAS = ''session''      # 上面CACHES字典配置的缓存,key 为 session

django memcached/redis缓存 =====缓存session

django memcached/redis缓存 =====缓存session

  • 全站使用

例如 博客等缓存,通过中间件实现全站缓存。

加缓存中间件,那么多中间件加在什么位置?

请求时:缓存加在中间件里的最后一个,比如一次经过1、2、3、4中间件,加在4

返回事:缓存加在中间件里的第一个,如上返回依次经过4、3、2、1,加在1

django 中,导入模块,可以实现。

# 使用中间件,经过一系列的认证等操作,
# 如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,
# 当返回给用户之前,判断缓存中是否已经存在,
# 如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
    MIDDLEWARE = [
        ''django.middleware.cache.UpdateCacheMiddleware'', # 只有process_response # 其他中间件... ''django.middleware.cache.FetchFromCacheMiddleware'', # 只有process_view ] CACHE_MIDDLEWARE_ALIAS = "" CACHE_MIDDLEWARE_SECONDS = "" CACHE_MIDDLEWARE_KEY_PREFIX = ""

2.2 应用多个缓存时生效的优先级

另外:session引擎缓存配置,就是放在这里的缓存里。

如果同时应用了两个级别的缓存,比如views缓存和模板局部缓存,哪个生效?

哪个生效,和请求的声明周期的有关系的

所以最先生效的是全站、之后views、最后模板局部缓存。

 

 

 

django-redis的应用

# =================django-redis============

settings.py配置cache

CACHES = {
  "default": {
  "BACKEND": "django_redis.cache.RedisCache",
  "LOCATION": "redis://127.0.0.1:6379",
  "OPTIONS": {
  "CLIENT_CLASS": "django_redis.client.DefaultClient",
  "CONNECTION_POOL_KWARGS": {"max_connections": 100}     #最大连接数,redis开启连接池pool
  # "PASSWORD": "密码",   #redis默认没有密码
  }}
  }

视图函数中使用
  from django_redis import get_redis_connection   conn = get_redis_connection("default")

缓存session(通过redis/memcache之类)
  配置 settings.py
     SESSION_ENGINE  =  ''django.contrib.sessions.backends.cache''   # 启用cache引擎
     SESSION_CACHE_ALIAS  =  ''default''                             # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
 
     SESSION_COOKIE_NAME =  "sessionid"                         # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
     SESSION_COOKIE_PATH =  "/"                                 # Session的cookie保存的路径
     SESSION_COOKIE_DOMAIN  =  None                               # Session的cookie保存的域名
     SESSION_COOKIE_SECURE  =  False                              # 是否Https传输cookie
     SESSION_COOKIE_HTTPONLY  =  True                             # 是否Session的cookie只支持http传输
     SESSION_COOKIE_AGE  =  1209600                               # Session的cookie失效日期(2周)
     SESSION_EXPIRE_AT_BROWSER_CLOSE  =  False                    # 是否关闭浏览器使得Session过期
     SESSION_SAVE_EVERY_REQUEST  =  False                         # 是否每次请求都保存Session,默认修改之后才保存
 
 
通过django的内置模块,连接缓存
from django.core.cache import cache
cache.has_key(''name'')#判断是否有key等于name
cache.set(key,value,timeout=''过期时间'') timeout可选参数
cache.get(key)

Django Redis 存储 session 会话

Django Redis 存储 session 会话

 

通常 redis 都是用来保存 session、短信验证码、图片验证码等数据。

在 django 上使用 redis,先要安装一个包:

pip install django-redis==4.8.0 (我用的 django 是 1.11.1 版本)

在 settings 上配置:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://192.168.8.102:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "session": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://192.168.8.102:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "sms_codes": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://192.168.8.102:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

# 保存 session数据到 Redis中
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

 

在视图中使用:

# 在redis上查看存储的会话

# 2) ":1:django.contrib.sessions.cachehdrgn4pbtnylv23241089a4ajfkh8f4f"
import json
from django_redis import get_redis_connection

con = get_redis_connection("sms_codes") #con就是StrictRedis类型,default对应settings.py中CACHES中设置的sms_codes

# dict序列化字符串存储到redis
name = "zhangsan"
val = {"is_login": "True", "username": "zhangsan"}
res = con.set(name, json.dumps(val))

# 从redis取数据
# res = eval(con.get("zhangsan").decode("utf-8"))
res =con.get(name)
print(res)


 

 

 

 

cp:https://blog.csdn.net/houyanhua1/article/details/84992717

https://blog.csdn.net/houyanhua1/article/details/85052846

https://www.cnblogs.com/yuanchenqi/articles/5716193.html

https://www.jianshu.com/p/2639549bedc8

django 使用 redis 存放 session

django 使用 redis 存放 session

1. 安装 & 配置

(1). 首先安装配置 django-redis-sessions:

pip install django-redis-sessions

在 settings.py 中设置 SESSION_ENGINE, 它默认是: django.contrib.sessions.backends.db 这里设置如下:

SESSION_ENGINE = ''django.contrib.sessions.backends.cache''

(2). 安装配置 django-redis-cache

pip install django-redis-cache 
CACHES = {
    ''default'': {
        ''BACKEND'': ''redis_cache.RedisCache'',
        ''LOCATION'': ''127.0.0.1:6379'',
        ''OPTIONS'': {
            ''DB'': 0,
            ''PASSWORD'': '''', # 这里没有设置密码
            # ''PARSER_CLASS'': ''redis.connection.HiredisParser'',  # 这段可先注释掉否则出现 :Hiredis is not installed的错误
            ''CONNECTION_POOL_CLASS'': ''redis.BlockingConnectionPool'',
            ''CONNECTION_POOL_CLASS_KWARGS'': {
                ''max_connections'': 50,
                ''timeout'': 20,
            }
        },
    },
}

 

今天关于Golang web 开发实战之 session 缓存:如何使用 redigo 将一个结构体数据保存到 redis?的分享就到这里,希望大家有所收获,若想了解更多关于22_redis 缓存配置及设置把 session 存储在 redis 中、django memcached/redis缓存 =====缓存session、Django Redis 存储 session 会话、django 使用 redis 存放 session等相关知识,可以在本站进行查询。

本文标签: