Redis数据类型
一、Set 类型
Set 类型:无序集合,数据唯一
1、SADD添加集合中的元素
SADD:添加集合中的元素
127.0.0.1:6379> sadd jihe 1 11 21 31 (integer) 4
2、SMEMBERS获取集合中的所有元素
SMEMBERS:获取集合中的所有元素
127.0.0.1:6379> smembers jihe 1) "1" 2) "11" 3) "21" 4) "31"
3、SCARD查询集合中的元素个数
SCARD:查询集合中的元素个数
127.0.0.1:6379> scard jihe (integer) 4
4、SISMEMBER判断指定的元素是否在指定的集合中
SISMEMBER:判断指定的元素是否在指定的集合中
127.0.0.1:6379> sismember jihe ac (integer) 0 # 元素不存在 127.0.0.1:6379> sismember jihe 21 (integer) 1 # 元素存在
5、SREM删除集合中指定的元素
SREM:删除集合中指定的元素
127.0.0.1:6379> srem jihe 1 (integer) 1 127.0.0.1:6379> srem jihe 31 21 (integer) 2
6、SPOP随机删除集合中的元素。可以指定删除元素的个数 , 不写默认删除1个
SPOP:随机删除集合中的元素。
127.0.0.1:6379> spop jihe "71" 127.0.0.1:6379> spop jihe 3 1) "31" 2) "11" 3) "1"
7、SRANDMEMBER:随机返回集合中的某个元素
SRANDMEMBER:随机返回集合中的某个元素,可以指定返回元素的个数 , 不写默认返回一个
127.0.0.1:6379> srandmember jihe "61" 127.0.0.1:6379> srandmember jihe 4 1) "41" 2) "31" 3) "61" 4) "51"
8、SMOVE将集合A中的元素移动到集合B中
SMOVE:将集合A中的元素移动到集合B中
127.0.0.1:6379> smembers jihe 1) "1" 2) "21" 3) "31" 4) "41" 5) "51" 6) "61" 7) "71" 127.0.0.1:6379> smove jihe B 21 (integer) 1 127.0.0.1:6379> smembers B 1) "2" 2) "21" 3) "22" 4) "32" 127.0.0.1:6379> smembers jihe 1) "1" 2) "31" 3) "41" 4) "51" 5) "61" 6) "71"
9、SDIFF
SDIFF:返回集合的差集
127.0.0.1:6379> sdiff A B # 计算 集合A独有的元素 1) "1" 2) "11" 3) "31" 127.0.0.1:6379> sdiff B A # 计算 集合B独有的元素 1) "2" 2) "22"
SDIFFSTORE:将两个集合的差集结果保存为一个新的集合
127.0.0.1:6379> sdiffstore sAb A B (integer) 3 127.0.0.1:6379> smembers sAb 1) "1" 2) "11" 3) "31"
10、SINTER
SINTER:计算两个集合的交集
127.0.0.1:6379> sinter A B 1) "21" 2) "32"
SINTERSTORE:计算两个集合的交集保存为一个新的集合
127.0.0.1:6379> sinterstore jab A B (integer) 2 127.0.0.1:6379> smembers jab 1) "21" 2) "32"
11、SUNION
SUNION:计算两个集合的并集
127.0.0.1:6379> sunion A B 1) "1" 2) "2" 3) "11" 4) "21" 5) "22" 6) "31" 7) "32"
SUNIONSTORE:计算两个集合的并集保存为一个新的集合
127.0.0.1:6379> sunionstore bab A B (integer) 7 127.0.0.1:6379> smembers bab 1) "1" 2) "2" 3) "11" 4) "21" 5) "22" 6) "31" 7) "32"
二、ZSet 类型
ZSet 类型:有序集合,和 Set 集合是一样的,数据不允许重复。
不同的是每个元素都会有一个 double 类型的数据和集合中的元素进行对应,在 Redis 数据库中就是通过这个 double 类型来对集合中的数据进行排序。
集合中的元素必须是唯一的 ,但是这个关联的 double 类型数据可以重复。
1、ZADD
ZADD: 向有序集合中添加数据
127.0.0.1:6379> zadd stu 6 ac 7 ql (integer) 2 127.0.0.1:6379> zadd stu 10 ac (integer) 0 # 元素存在不会添加 ,但是会修改掉其元素的对应关系的数据
2、ZRANGE
ZRANGE:获取集合中指定区间的元素,在返回数据的时候出现元素关联的 double 类型数据需要在命令后面添加 withscores.
127.0.0.1:6379> zrange stu 0 -1 1) "ql" 2) "ac" 127.0.0.1:6379> zrange stu 0 -1 withscores 1) "ql" 2) "7" 3) "ac" 4) "10"
ZREVRANGE: 获取集合中指定区间的元素,返回的顺序是降序
127.0.0.1:6379> zrevrange stu 0 -1 1) "ac" 2) "ql" 127.0.0.1:6379> zrevrange stu 0 -1 withscores 1) "ac" 2) "10" 3) "ql" 4) "7"
3、ZCARD
ZCARD:返回集合中的元素个数
127.0.0.1:6379> zcard stu (integer) 2
5、ZCOUNT
ZCOUNT:统计有序集合中关联数据在指定的范围内的元素个数
127.0.0.1:6379> zcount stu 0 10 # 0 <= stu <= 10 (integer) 2 127.0.0.1:6379> zcount stu 10 20 # 10 <= stu <= 20 (integer) 4 127.0.0.1:6379> zcount stu 10 (20 # 10 <= stu < 20 (integer) 3 127.0.0.1:6379> zcount stu (10 (20 # 10 < stu < 20 (integer) 2
6、ZRANGEBYSCORE
ZRANGEBYSCORE:获取有序集合中关联数据在指定的范围内的元素
127.0.0.1:6379> zrangebyscore stu 10 20 1) "ac" 2) "a" 3) "b" 4) "c" 127.0.0.1:6379> zrangebyscore stu 10 20 withscores 1) "ac" 2) "10" 3) "a" 4) "15" 5) "b" 6) "17" 7) "c" 8) "20"
7、ZRANK
ZRANK:获取元素在有序集合中的排序下标,关联数据从小到大排序
127.0.0.1:6379> zrank stu ac (integer) 1 127.0.0.1:6379> zrank stu ql (integer) 0
8、ZREVRANK
ZREVRANK:获取元素在有序集合中的排序下标,关联数据从大到小排序
127.0.0.1:6379> zrevrank stu ac (integer) 11 127.0.0.1:6379> zrevrank stu ql (integer) 12
三、Hash 类型
hash 存储是一个 String 类型的 field 和 value 的映射关系
1、HSET
HSET:设置 hash 类型的数据
# hls = {'name':'ac'} 127.0.0.1:6379> hset hls name ac (integer) 1
2、HGET
HGET:获取 hash 类型中的数据‘
127.0.0.1:6379> hget hls name "ac"
3、HMSET,HMGET
HMSET:批量创建多个 hash 数据值
HMGET:批量获取多个 hash 数据值
127.0.0.1:6379> hmset hls age 27 gender man adder China OK 127.0.0.1:6379> hmget hls name age adder 1) "ac" 2) "27" 3) "China"
4、HDEL
HDEL:删除指定的数据
127.0.0.1:6379> hdel hls gender (integer) 1
5、HVALS
HVALS:获取指定的 key 中的所有数据
127.0.0.1:6379> hvals hls 1) "ac" 2) "27" 3) "China"
6、HKEYS
HKEYS:获取指定 key 中的所有 字段名
127.0.0.1:6379> hkeys hls 1) "name" 2) "age" 3) "adder"
7、HEXISTS
HEXISTS:判断指定的 key 中的字段是否存在
127.0.0.1:6379> hexists hls gender (integer) 0 # 返回0:表示不存在 127.0.0.1:6379> hexists hls age (integer) 1
8、HSETNX
HSETNX:在设置字段值的时候,如果字段存在则忽略这个命令;字段不存在则执行这个命令
127.0.0.1:6379> hsetnx hls name ql (integer) 0 127.0.0.1:6379> hvals hls 1) "ac" 2) "27" 3) "China" 127.0.0.1:6379> hsetnx hls height 1.85 (integer) 1 127.0.0.1:6379> hget hls height "1.85"
四、事务管理
NOSQL给 Redis 提供了事务机制。
Redis 的事务是一次性的,顺序性的。和关系型数据库中的事务相比,在Redis 的事务中如果有一条命令失败了,那么其他命令不受影响会继续执行。
关系数据库的事务:要么全部都执行,要么全部都不执行(原子性)
Redis 的事务没有隔离级别的概念
批量操作发送 EXEC 命令之前被放入一个队列缓存,并不会被实际执行,也就是不存在不同事务之间的查询是看到事务内更新的数据,事务外也查询不到。
Redis不保证原子性,Redis中的事务是没有回滚。
Redis的事务通过 MULTI 的命令开启事务;通过 EXEC 命令提交事务
127.0.0.1:6379> multi OK 127.0.0.1:6379> set name ac QUEUED 127.0.0.1:6379> set age 30 QUEUED 127.0.0.1:6379> exec 1) OK 2) OK 127.0.0.1:6379> mget name age 1) "ac" 2) "30"
Redis 事务中在操作命令进入队列前发生错误是不可以提交的 , 队列中的所有操作是无效的
127.0.0.1:6379> multi OK 127.0.0.1:6379> set k k QUEUED 127.0.0.1:6379> sete u u (error) ERR unknown command `sete`, with args beginning with: `u`, `u`, 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors.
Redis 事务中的操作命令进入队列之后发生的错误,事务是可以提交的,但是不保证提交的命令能够执行成功。
127.0.0.1:6379> multi OK 127.0.0.1:6379> set k k QUEUED 127.0.0.1:6379> set u ac i QUEUED 127.0.0.1:6379> exec 1) OK 2) (error) ERR syntax error 127.0.0.1:6379> get k "k"
五、Python 连接 Redis
需要第三方模块
pip install redis
import redis # 创建 Redis 连接池 pool = redis.ConnectionPool(decode_responses=True , max_connections=10) # 从 Redis 连接池中获取一个链接进行使用 conn = redis.Redis(connection_pool=pool) conn.set('name','ql') print(conn.get('name')) conn.lpush('ls' , 2 , 32 , 22) print(conn.lrange('ls' , 0 , -1))
六、Django 连接 Redis
需要第三方模块
pip install django_redis
django 在配置文件中配置连接的 Redis 数据库信息
# 配置 Redis 缓存数据库信息 CACHES = { # 默认使用的 Redis 数据库 "default":{ # 配置数据库指定引擎 "BACKEND" : "django_redis.cache.RedisCache", # 配置使用 Redis 的数据库名称 "LOCATION" : "redis://127.0.0.1:6379/0", "OPTIONS":{ "CLIENT_CLASS" : "django_redis.client.DefaultClient" } }, # 将 session 的数据保存位置修改到 redis 中 "session":{ # 配置数据库指定引擎 "BACKEND" : "django_redis.cache.RedisCache", # 配置使用 Redis 的数据库名称 "LOCATION" : "redis://127.0.0.1:6379/1", "OPTIONS":{ "CLIENT_CLASS" : "django_redis.client.DefaultClient" } }, } # 修改 session 默认的存储机制 SESSION_ENGINE = "django.contrib.sessions.backends.cache" # 配置 SESSION 要缓存的地方 SESSION_CACHE_ALIAS = "session"
if __name__ == '__main__': import os os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_auth.settings') import django django.setup() from django_redis import get_redis_connection # 获取数据库连接 , 没有参数默认使用配置文件中的默认数据库 # conn = get_redis_connection() conn = get_redis_connection('session') conn.set('gender' , 'boy') print(conn.get('gender').decode())