Redis数据类型
一、Set 类型
Set 类型:无序集合,数据唯一
1、SADD添加集合中的元素
SADD:添加集合中的元素
shell
127.0.0.1:6379> sadd jihe 1 11 21 31
(integer) 4
2、SMEMBERS获取集合中的所有元素
SMEMBERS:获取集合中的所有元素
shell
127.0.0.1:6379> smembers jihe
1) "1"
2) "11"
3) "21"
4) "31"
3、SCARD查询集合中的元素个数
SCARD:查询集合中的元素个数
shell
127.0.0.1:6379> scard jihe
(integer) 4
4、SISMEMBER判断指定的元素是否在指定的集合中
SISMEMBER:判断指定的元素是否在指定的集合中
shell
127.0.0.1:6379> sismember jihe ac
(integer) 0 # 元素不存在
127.0.0.1:6379> sismember jihe 21
(integer) 1 # 元素存在
5、SREM删除集合中指定的元素
SREM:删除集合中指定的元素
shell
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:随机删除集合中的元素。
shell
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:随机返回集合中的某个元素,可以指定返回元素的个数 , 不写默认返回一个
shell
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中
shell
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:返回集合的差集
shell
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:将两个集合的差集结果保存为一个新的集合
shell
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:计算两个集合的交集
shell
127.0.0.1:6379> sinter A B
1) "21"
2) "32"
SINTERSTORE:计算两个集合的交集保存为一个新的集合
shell
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:计算两个集合的并集
shell
127.0.0.1:6379> sunion A B
1) "1"
2) "2"
3) "11"
4) "21"
5) "22"
6) "31"
7) "32"
SUNIONSTORE:计算两个集合的并集保存为一个新的集合
shell
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: 向有序集合中添加数据
shell
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.
shell
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: 获取集合中指定区间的元素,返回的顺序是降序
shell
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:返回集合中的元素个数
shell
127.0.0.1:6379> zcard stu
(integer) 2
5、ZCOUNT
ZCOUNT:统计有序集合中关联数据在指定的范围内的元素个数
shell
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:获取有序集合中关联数据在指定的范围内的元素
shell
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:获取元素在有序集合中的排序下标,关联数据从小到大排序
shell
127.0.0.1:6379> zrank stu ac
(integer) 1
127.0.0.1:6379> zrank stu ql
(integer) 0
8、ZREVRANK
ZREVRANK:获取元素在有序集合中的排序下标,关联数据从大到小排序
shell
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 类型的数据
shell
# hls = {'name':'ac'}
127.0.0.1:6379> hset hls name ac
(integer) 1
2、HGET
HGET:获取 hash 类型中的数据'
shell
127.0.0.1:6379> hget hls name
"ac"
3、HMSET,HMGET
HMSET:批量创建多个 hash 数据值
HMGET:批量获取多个 hash 数据值
shell
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:删除指定的数据
shell
127.0.0.1:6379> hdel hls gender
(integer) 1
5、HVALS
HVALS:获取指定的 key 中的所有数据
shell
127.0.0.1:6379> hvals hls
1) "ac"
2) "27"
3) "China"
6、HKEYS
HKEYS:获取指定 key 中的所有 字段名
shell
127.0.0.1:6379> hkeys hls
1) "name"
2) "age"
3) "adder"
7、HEXISTS
HEXISTS:判断指定的 key 中的字段是否存在
shell
127.0.0.1:6379> hexists hls gender
(integer) 0 # 返回0:表示不存在
127.0.0.1:6379> hexists hls age
(integer) 1
8、HSETNX
HSETNX:在设置字段值的时候,如果字段存在则忽略这个命令;字段不存在则执行这个命令
shell
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 命令提交事务
shell
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 事务中在操作命令进入队列前发生错误是不可以提交的 , 队列中的所有操作是无效的
shell
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 事务中的操作命令进入队列之后发生的错误,事务是可以提交的,但是不保证提交的命令能够执行成功。
shell
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
python
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 数据库信息
python
# 配置 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"
python
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())