Redis数据类型

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis数据类型

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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 消息中间件 NoSQL
Redis数据类型详解:选择合适的数据结构优化你的应用
Redis数据类型详解:选择合适的数据结构优化你的应用
|
30天前
|
存储 JSON NoSQL
Redis数据结构介绍及Redis的基本数据类型
Redis数据结构介绍及Redis的基本数据类型
42 3
|
1月前
|
存储 NoSQL 程序员
Redis -- 常用数据结构,认识数据类型和编码方式
Redis -- 常用数据结构,认识数据类型和编码方式
18 2
|
9天前
|
存储 消息中间件 NoSQL
使用 Java 操作 Redis 数据类型的详解指南
使用 Java 操作 Redis 数据类型的详解指南
7 0
|
1月前
|
NoSQL Redis 数据库
Redis中的常用命令非常丰富,涵盖了各种数据类型的基本操作以及服务器管理和维护的相关指令
【5月更文挑战第15天】Redis常用命令包括通用(如PING、SELECT)、键操作(KEYS、EXISTS、DEL)、字符串(SET、GET)、哈希(HSET、HGET)、列表(LPUSH、LPOP)、集合(SADD、SMEMBERS)和有序集合(ZADD、ZRANGE)等。这些命令用于数据操作及服务器管理,满足不同场景需求。了解更多命令,建议参考Redis官方文档。
38 2
|
18天前
|
消息中间件 NoSQL Redis
Redis第三弹,定时删除1.优先级队列(堆)2.基于时间轮实现的定时器​编辑Type指令(返回key对应的数据类型)redis的数据类型hset key field value
Redis第三弹,定时删除1.优先级队列(堆)2.基于时间轮实现的定时器​编辑Type指令(返回key对应的数据类型)redis的数据类型hset key field value
|
1月前
|
存储 NoSQL 定位技术
Redis常用数据类型及常用命令
这些是Redis中常用的数据类型和命令。Redis还提供了许多其他命令和功能,用于数据存储、操作和查询。你可以根据需要选择适当的数据类型和命令来满足你的应用程序需求。
37 4
|
1月前
|
SQL NoSQL Java
Redis数据类型 Hash Set Zset Bitmap HyperLogLog GEO
Redis数据类型 Hash Set Zset Bitmap HyperLogLog GEO
30 0
|
1月前
|
存储 SQL NoSQL
Redis入门到通关之五大基本数据类型及其使用场景
Redis入门到通关之五大基本数据类型及其使用场景
24 0
|
1月前
|
存储 NoSQL Redis
第十八章 Redis查看配置文件和数据类型
第十八章 Redis查看配置文件和数据类型
28 0