Redis数据类型

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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
相关文章
|
4天前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
12 1
|
24天前
|
存储 消息中间件 NoSQL
Redis 数据类型
10月更文挑战第15天
35 1
|
2月前
|
存储 消息中间件 缓存
深入探析Redis常见数据类型及应用场景
深入探析Redis常见数据类型及应用场景
48 2
|
3月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
3月前
|
NoSQL Java Redis
Redis5种数据类型
这篇文章介绍了Redis的五种数据类型:字符串、列表、集合、有序集合和哈希,并通过代码示例展示了如何在Spring框架中使用RedisTemplate操作这些数据类型。
Redis5种数据类型
|
3月前
|
存储 NoSQL Java
深入理解Redis数据类型Hashes原理
本文深入分析了Redis中的hashes数据类型,这是一种用于存储行记录的数据结构,允许一个key下存储多条记录。
深入理解Redis数据类型Hashes原理
|
3月前
|
存储 NoSQL 算法
深入理解Redis数据类型Zset原理
本文深入探讨了Redis中的Zset(有序集合)数据类型,它是一种可以存储排序功能的集合,其中每个元素都具有一个浮点型的score属性,用于根据score进行排序。
深入理解Redis数据类型Zset原理
|
3月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。
|
3月前
|
消息中间件 存储 NoSQL
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
本文档介绍了如何使用 Go 语言中的 `go-redis` 库操作 Redis 数据库
169 0
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
|
3月前
|
存储 缓存 NoSQL
深入理解Redis数据类型String原理
本文深入探讨了Redis中String数据类型的实现原理和使用场景,基于Redis 5.0版本进行分析。
深入理解Redis数据类型String原理