Redis数据类型

本文详细介绍了Redis中的Set、ZSet、Hash数据类型,包括它们的基本操作,如添加、查询、删除等,并探讨了Redis的事务机制,以及如何在Python和Django中使用Redis进行数据操作和缓存管理。
摘要由CSDN通过智能技术生成

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())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值