1. Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理。 2. 它支持数据结构,如 字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志和带有半径查询的地理空间索引。 3. Redis具有内置复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel提供高可用性和Redis Cluster自动分区。
1. redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。 2. 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。 3. 在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。 4. 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis的外围由一个键、值映射的字典构成。与其他非关系型数据库主要不同在于:Redis中值的类型不仅限于字符串,还支持如下抽象数据类型:
1. 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
2. 支持丰富数据类型,支持string,list,set,sorted set,hash
3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
4. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
代码示例:
import redis
redis_info = {
"host": "110.40.129.50",
"password": "REDIS_123456!",
"port": 6380,
"db": 10
}
# 连接redis,可以在连接时直接添加 decode_responses=True,这样在输入结果的时候直接是 str 类型,而不是 byte 类型
r = redis.Redis(**redis_info, decode_responses=True)
# string 字符换的操作
r.set("error_count.18600597534", 5) # 添加数据
print(r.get("error_count.18600597534")) # 获取数据
print(r.ttl("error_count.18600597534")) # 查看失效时间
print(r.type("error_count.18600597534")) # 查看key 的类型
print("exists", r.exists("error_count.18600597534")) # 查看key是否存在,存在返回 1
# 如果另外加了一个参数的话,此时相当于设置了一个失效时间,到期后直接失效了
r.set("token_count.18600597534", "afksjkfasdfhaksdhfasdfhafd", 50)
print(r.ttl("token_count.18600597534"))
print(word.center(30, "*"))
# hash
r.hset("class1", "xiaohong", '{"id":1,"age":20}')
r.hset("class2", "lilei", '{"id":1,"age":30}')
print(r.hget("class1", "xiaohong")) # 取出指定的
print(r.hgetall("class1")) # 取出所有的
# r.delete("class1", "xiaohong") # 删除执行的key
r.expire("class1", 500) # 设置执行的key失效时间
print(r.hexists("class1", "xiaohong")) # 执行的小key 是否存在
print(r.hkeys("class1")) # 获取 hash 下面所有的小key 是否存在
print(r.hvals("class1")) # 获取hash虾米那的所有的value
stus = {"zhangsan": "sdad", "lisi": "adsjfajf", "zhouwu": "asdkfhadf"}
# r.hmset("class1", stus) # 批量设置
r.hset("class1", mapping=stus) # 批量设置 value
# 在 redis 中使用 : 时相当于文件夹,在添加时想当于按照文件夹去展示
r.set("user:token:zhangdan", '{"age":12,"id":1}')
print(word.center(30, "*"))
# list
r.lpush("student", "lixaing") # 从开头增加元素,如果这个 key 不存在会新建一个
# r.delete("student") # 删除key
r.lpushx("student", "zhangdan") # 从list同步增加元素,如果这个 key 不存在不会新建一个
print(r.lrange("student", 0, -1)) # 获取指定区间的下标的元素
print(r.lindex("student", 0)) # 获取指定下标的元素
print(r.llen("student")) # 获取list的长度
# 在指定位置的添加元素,要传 key、位置(before/after)、哪个参数、实际参数
print(r.linsert("student", "BEFORE", "xiaobai", "DAHUA"))
print(r.linsert("student", "AFTER", "xiaobai", "DAHUA"))
r.lset("student", 0, "Zhulixiang") # 修改执行下标的元素
print(r.lpop("student")) # 删除末尾的元素
r.lrem("students", 1, "xiaohei") # 删除指定的元素,传0的话,删除所有的
print(word.center(30, "*"))
# set
r.sadd("stu2", "xiaobai", "xiaohei", "zhangdan") # 添加
r.sadd("stu3", "xiaobai", "xiaohei1", "zhangdan2") # 添加
print(r.smembers("stu2")) # 返回这个集合的所有元素
print(r.spop("stu2")) # 随机删除一个元素
print(r.sismember("stu2", "xiaosan")) # 判断一个元素是否在这个集合里
print(r.scard("stu2")) # 返回集合中有多少个元素
print(r.sinter("stu2", "stu3")) # 返回两个集合的交集
# 也可以使用 redis 命令去远程连接
# ./redis-cli -p 6380 -a 'REDIS13456!' -h '110.233.33.33'