Redis是一个开源(BSD许可),内存存储的数据结构服务器,是一个高性能的键值对数据库。Redis以其内存中数据存储、低延迟和原子操作而闻名,可用作数据库、高速缓存和消息队列。它支持字符串、哈希表、列表、集合、有序集合等数据类型。Redis 的作者antirez开发 Redis 的动机主要是为了解决他在使用现有数据库解决方案时需要频繁操作磁盘IO导致性能存在瓶颈的问题,如今Redis已经成为主流,它几乎出现在所有的web服务中。
由于Redis作者antirez系统编程的背景,antirez更喜欢从列表、散列和集合等数据结构的角度来思考问题,因此redis支持的数据类型都是较低级别的数据结构,这反而为数据库领域带来了新的想法,它支持的基本数据结构类型有:
快速上手Redis的办法就是实际去使用它,可以参考我在在Ubuntu24.04 LTS系统上如何安装redis一文中的方法搭建Redis环境,再安装一个Redis客户端(如Another Redis Desktop Manager)连接Redis进行练习,远程连接redis一般需要配置host、port、password。
连接成功后可以进入命令行模式熟悉redis操作,接下来就以redis常用的几种数据类型为例来熟悉基本的命令
字符串类型
# 创建key为string_key, value为hello redis的字符串类型set string_key "hello redis"# 查询key为string_key的字符串的值,结果为hello redisget string_key客户端工具也提供了GUI的设置和查看方法,非常的方便
哈希表类型
# 创建key为hask_key, value为哈希表{a: 1, b: 2}的hash数据对象hmset hash_key a 1 b 2# 查询key为hash_key, hash表对象a、b的值,结果为1、2hmget hash_key a b
列表类型
# 创建key为list_key的列表类型数据,并向value添加字符alpush list_key a# 继续向list_key添加字符b,这时list_key对应的值为列表[a, b]lpush list_key b# 从list_key对应的列表中弹出一个值,列表为后进先出队列,因此先弹出blpop list_key# 继续弹出一个值,此时弹出alpop list_key# 如果继续弹出的话,因为列表已经为空返回nulllpop list_key
集合类型
集合和列表很相似,不同之处在一集合不会出现重复项
# 连续向set_key添加a、b、a三个字符,最终得到的value为集合{a, b},字符a被覆盖sadd set_key asadd set_key bsadd set_key a# 同样地使用spop命令逐个弹出集合中的值,也是后进先出,弹出的顺序为b、a、nullspop set_key
有序集合类型
有序集合和集合类型,不同之处在于集合的每一个元素会分配一个double类型的分数,并按照这个分数进行排序
# 连续向key为sorted_key的有序集合中添加元素{a: 3}、{b: 2}、{c: 1}三个指定了分数的元素# 从下图展示的结果可以看出集合按照score进行了降序排列zadd sorted_key 3 azadd sorted_key 2 bzadd sorted_key 1 c# zpopmin命令从有序集合中弹出元素,从score最小的开始,可以指定弹出的元素数量,下面的命令弹出c 1zpopmin sorted_key 1# zpopmax命令从有序集合中弹出元素,从score最大的开始,可以指定弹出的元素数量,下面的命令弹出a 3zpopmax sorted_key 1
从上面关于有序集合的特性不难发现它非常适合用来搭建一个优先级队列。
上面展示的Redis命令只是其中的很少的一部分,但是逐个实践之后相信一定会对redis的使用有了一定的基础,接下来可以通过查看命令行手册发掘更多有用的命令。
Redis的命令一般只是学习和调试时才会使用,真正的应用都是使用编程语言对redis进行读写等操作,python redis模块为Redis的一个客户端库,它提供的方法几乎和Redis命令如出一辙,下面就以有序集合为例演示操作Redis的基本方法。
首先执行下面的命令安装redis模块
pip install redis
下面演示代码展示如何添加、查询、弹出、删除有序集合,其他数据类型只要参考redis命令就可以很容易知道该怎么写
# 导入redis模块from redis import StrictRedisREDIS_URL = "redis://:ABC1234@192.168.1.18:6379/0"if __name__ == "__main__": # redis支持传入host、port、password以及指定redis_url两种方式建立redis连接 # redis = StrictRedis(host='192.168.1.18', port=6379, db=0, password='ABC1234') redis = StrictRedis.from_url(REDIS_URL) # 添加有序集合,zadd刚好对应redis有序集合的添加命令 redis.zadd('language', {'python': 0}) redis.zadd('language', {'rust': 99}) redis.zadd('language', {'ruby': 3}) redis.zadd('language', {'c': 66}) # 查询全部有序集合,从小到大排序 data = redis.zrangebyscore('language', 0, 100) for i in data: print(i.decode('utf-8')) # 弹出有序集合,从最大的开始取,可以指定取出数量 data = redis.zpopmax('language', 1) print(data) # 删除有序集合 redis.delete('language') # 关闭redis连接 redis.close()
运行输出结果:
pythonrubycrust[(b'rust', 99.0)]
redis模块同样支持异步编程模式,使得redis可以在无阻塞模式下运行,下面给出异步模式示例代码,运行结果是一样的。
import asyncio# 导入redis异步模块from redis import asyncio as aioredisREDIS_URL = "redis://:ABC1234@192.168.1.18:6379/0"async def redis_demo_async(): # redis支持传入host、port、password以及指定redis_url两种方式建立redis连接 # redis = StrictRedis(host='192.168.1.18', port=6379, db=0, password='ABC1234') redis = aioredis.from_url(REDIS_URL) # 添加有序集合 await redis.zadd('language', {'python': 0}) await redis.zadd('language', {'rust': 99}) await redis.zadd('language', {'ruby': 3}) await redis.zadd('language', {'c': 66}) # 查询全部有序集合,从小到大排序 data = await redis.zrangebyscore('language', 0, 100) for i in data: print(i.decode('utf-8')) # 弹出有序集合,从最大的开始取,可以指定取出数量 data = await redis.zpopmax('language', 1) print(data) # 删除有序集合 await redis.delete('language') await redis.aclose()if __name__ == "__main__": asyncio.run(redis_demo_async())