"""
1.什么是redis
redis是key-value型的非关系型数据库(noSQL),通过键值对的方式来存储数据,
并且它的数据是存在内存中的,通过直接将数据备份到硬盘和将指令备份到硬盘的策略来对数据进行持久化
2.redis中支持的数据类型
1)字符串
2)哈希
3)列表
4)集合
5)有序集合
redis中操作不同类型的数据,对应的指令不同
3.常用指令:
auth 密码 - 通过密码登录
quit - 退出
keys - 取数据库所有的key值
flushall - 删除所有数据
flushdb - 删除当前数据库对应的数据
select 数据库标号 - 切换数据库(redis默认有16个已经存在的数据库,对应的标号分别是0-15)
ttl key - 获取指定key对应的键值对存活的时间
...
===========================
name zhuming
stu1 {name zhuming,age 18,gender male}
students []
nums ()
===========================
"""
下面的操作中还少了一些集合和有序集合的例子,可以上菜鸟教程学习
import redis
def main():
try:
# 1.连接redis服务器
# host - 主机地址
# password - 密码
# decode_response - 是否对返回的数据进行解码,如果不解码所有指令的结果都是二进制数据,解码后会变成字符串
r = redis.StrictRedis(host='47.75.146.226', password='zhuming', decode_responses=True)
# 获取缓存对象
pipe = r.pipeline()
# 2.通过跟redis指令相关的方法来操作数据
# redis 指令:指令名称 参数1 参数2 ...
# 指令对应的方法:指令名称(参数1,参数2,...)
# 注意:执行指令的时候可以通过redis对象直接执行相应指令获取结果,也可以将指令缓存到pipeline中,然后
# 通过pipeline对象调用execute执行缓存的所有指令,一次性获取所有的指令结果。第二种方法可以减少TCP连接次数,提高效率
# 3.相关指令
# =======================字符串相关================================
# 1)添加数据:set、mset、setnx ...
# r.set('age', 18)
pipe.set('gender', 'girl')
pipe.set('name', 'xiaoming')
# 2) 获取数据:get、mget
# print(r.get('age'))
pipe.get('name')
pipe.get('gender')
pipe.keys('*')
# =======================哈希相关================================
# 哈希数据就是对象数据:每个对象是由不同的属性(字段)和对应的值组成,哈希对应于的指令一般以h开头
# 1)赋值/修改值
# hset(key, 字段, 值) - 给指定key对应的对象的指定字段/属性赋值;返回值如果是1表示添加,返回值0表示修改
pipe.hset('dog1', 'name', '阿黄')
pipe.hset('dog1', 'color', '黄色')
# hsetnx(对象名,字段,值) - 只添加不修改
pipe.hsetnx('dog1', 'name', '阿黄')
pipe.hsetnx('dog1', 'gender', 'female')
# hmset(对象名,属性和值对应:dict) - 给指定对象同时添加/修改多个字段
pipe.hmset('dog2', {'name': '大黄', 'color': 'yellow', 'gender': '公狗'})
# 2)获取值
# hget(对象,字段) - 获取指定对象的指定属性的值
# hgetall(对象) - 获取指定对象的所有属性和对应的值,返回一个字典
# hmget(对象名,字段1,字段2,...) - 同时获取多个字段对应的值
# hvals(对象名) - 获取指定对象所有字段对应的值(返回值是列表)
pipe.hget('dog1', 'name')
pipe.hgetall('dog1')
pipe.hgetall('dog2')
pipe.hvals('dog2')
"""
dog1:{name: 阿黄, color: 黄色, gender: female}
dog2:{name: 大黄, color: yellow, gender:公狗}
list1: [1, 2, yu, zm]
"""
# 3)删除数据
# hdel(对象,字段1,字段2,...) - 删除指定对象中一个或者多个字段
pipe.hdel('dog1', 'gender', 'color')
pipe.hgetall('dog1')
rere = pipe.execute()
print(rere)
# =======================列表相关================================
# 1.添加元素
# lpush(列表名,元素1,元素2,元素3,...) - 给指定列表前面插入一个或多个元素,如果列表不存在会自动创建
# rpush(列表名,元素1,元素2,...) -给指定列表的后边插入一个或多个元素,如果列表不存在会自动创建
# lpushx(列表名,元素) - 给已经存在的列表的左边插入一个元素
# rpushx(列表名,元素) - 给已经存在的列表的右边插入一个元素
# pipe.lpush('nums', 1, 2)
# pipe.rpush('nums', 5, 6, 7)
"""
nums:[2,1,2,1]
"""
# 2.获取
# lrange(列表名,下标1,小标2) - 从下标1开始获取,获取到下标2位置(能取到), -1代表最后一个
pipe.lrange('nums', 0, -1)
rere = pipe.execute()
print(rere)
except Exception as error:
print('连接失败', error.message)
if __name__ == '__main__':
main()