Redis 是彻底开源免费的,遵照BSD协议,是一个高性能的key-value数据库。html
Redis 与其余 key - value 缓存产品有如下三个特色:python
Redis有着更为复杂的数据结构而且提供对他们的原子性操做,这是一个不一样于其余数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。linux
Redis运行在内存中可是能够持久化到磁盘,因此在对不一样数据集进行高速读写时须要权衡内存,由于数据量不能大于硬件内存。在内存数据库方面的另外一个优势是,相比在磁盘上相同的复杂的数据结构,在内存中操做起来很是简单,这样Redis能够作不少内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,由于他们并不须要进行随机访问。git
下载地址:https://github.com/MSOpenTech/redis/releases。程序员
下载的为.msc后缀的,只需一顿下一步便可!github
1 pip3 install redis
1 import redis 2 3 4 conn = redis.Redis(host='127.0.0.1', port=6379) 5 conn.set('animal', 'cat') 6 val = conn.get('animal') 7 print(val)
1 import redis 2 3 POOL = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=1000) # 建立链接池 4 conn = redis.Redis(connection_pool=POOL) 5 6 conn.set("key", "cat") 7 val = conn.get("key") 8 print(val)
1 # redis 就至关与内存中的一个字典。(session??) 2 redis = { 3 k1: 'hello', # String 4 k2: [1, 2, 3, 5, 4, 5, 2], # List 5 k3: {1, 2, 3, 4}, # Set 6 k4: {name: 'pontoon', age: 19}, # Dict/Hash 7 k5: {('pontoon': 65), ('god_v': 75), ('dandy': 85)} # SortedSet 8 }
1 import redis 2 3 POOL = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=1000) 4 conn = redis.Redis(connection_pool=POOL) 5 6 # conn.set("key", "cat") 7 # val = conn.get("key") 8 # print(val) 9 10 # 一、hset(name, key, value) # 设置单个值 11 conn.hset("k1", "animal", "dog") 12 13 # 二、hget(name,key) # 取单个值 14 val = conn.hget("k1", "animal") 15 print(val) # b'dog' 16 17 # 三、hmset(name, mapping) # 设置多个值 18 conn.hmset("k2", {"animal1": "cat", "animal2": "dog"}) 19 20 # 四、hmger(name, keys, *args) # 取多个值 21 val = conn.hmget("k2", "animal1", "animal2") 22 print(val) # [b'cat', b'dog'] 23 24 # 五、hgetall(name) # 获取name对应的全部值 25 val = conn.hgetall("k2") 26 print(val) # {b'animal1': b'cat', b'animal2': b'dog'} 27 28 # 六、hlen(name) # 获取个数 29 val = conn.hlen("k2") 30 print(val) # 2 31 32 # 七、hkeys(name) # 获取key 33 34 # 八、hvals(name) # 获取value 35 36 # 九、hexists(name, key) # 判断是否存在 37 val = conn.hexists("k2", "animal1") 38 print(val) # True 39 40 # 十、hdel(name,*keys) # 删除指定key中的键值对 41 42 # 十一、hincrby(name, key, amount=1) # 自增name对应的hash中的指定key的值,不存在则建立key=amount 43 44 # 十二、hscan(name, cursor=0, match=None, count=None) 45 """ 46 增量式迭代获取,对于数据大的数据很是有用,hscan能够实现分片的获取数据,并不是一次性将数据所有获取完,从而放置内存被撑爆 47 参数: 48 name,redis的name 49 cursor,游标(基于游标分批取获取数据) 50 match,匹配指定key,默认None 表示全部的key 51 count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 52 如: 53 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None) 54 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None) 55 ... 56 直到返回值cursor的值为0时,表示数据已经经过分片获取完毕 57 """ 58 59 # 1三、hscan_iter(name, match=None, count=None) 60 """ 61 利用yield封装hscan建立生成器,实现分批去redis中获取数据 62 63 参数: 64 match,匹配指定key,默认None 表示全部的key 65 count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 66 67 如: 68 for item in r.hscan_iter('xx'): 69 print item 70 """
关于第13条的一个补充:web
1 # 对于13的补充: 2 假设redis中有name=k4的一个字典,这个字典中有10个G的数据,咱们该如何取值? 3 ret = conn.hscan_iter("k4", count=10000) # 建立一个生成器对象,每次取1W条数据 4 for i in range(1000): 1000x10000 ≈ 10G 5 for item in ret: 6 print(item)
hscan_iter的源码redis
1 def hscan_iter(self, name, match=None, count=None): 2 """ 3 Make an iterator using the HSCAN command so that the client doesn't 4 need to remember the cursor position. 5 6 ``match`` allows for filtering the keys by pattern 7 8 ``count`` allows for hint the minimum number of returns 9 """ 10 # cursor表示游标 指明了count就至关于指明了cursor的数量 11 cursor = '0' 12 # 假如count=10000, 那么下一次迭代cursor='10000' 13 while cursor != 0: 14 cursor, data = self.hscan(name, cursor=cursor, match=match, count=count) 15 for item in data.items(): 16 yield item
1 import redis 2 3 4 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=1000) # 设置最大链接数量为1000 5 conn = redis.Redis(connection_pool=pool) # 链接链接池 6 7 # 一、lpush(name,values) # 列表的左侧添加数据 8 9 # 二、rpush(name, values) # 列表的右侧添加数据 10 conn.lpush("l1", "v1") 11 conn.lpush("l1", "v2") 12 conn.rpush("l1", "v3") 13 14 ret = conn.lrange("l1", 0, 100) # 范围取值,取前100条数据 15 print(ret) # [b'v2', b'v1', b'v3'] 16 17 # 三、lpushx(name, value) # 当name存在时,向列表左侧添加数据 18 19 # 四、rpushx(name, value) # 当name存在时,向列表右侧添加数据 20 21 # 五、lpop(name) # 列表的左侧弹出数据 22 23 # 六、rpop(name) # 列表的右侧弹出数据 24 val = conn.lpop("l1") 25 print(val) # b'v1' 26 27 val = conn.rpop("l1") 28 print(val) # b'v3' 29 30 31 # 七、llen(name) # name对应的list元素的个数 32 33 # 八、linsert(name, before/after, refvalue, value)) # 在name对应的列表的某一个值前或后插入一个新值 34 conn.linsert("l1", "before", "v2", "v3") # 在列表内找到第一个元素v2,在它前面插入v3 35 36 ret = conn.lrange("l1", 0, 100) 37 print(ret) 38 39 # 九、lset(name, index, value) # 对list中的某一个索引位置从新赋值 40 conn.lset("l1", 0, "v4") # 将索引为0的值从新赋值v4 41 42 ret = conn.lrange("l1", 0, 100) 43 print(ret) 44 45 # 十、lrem(name, num, value) 46 ''' 参数: 47 name: redis的name 48 num: num=0 删除列表中全部的指定值; 49 num=2 从前到后,删除2个; 50 num=-2 从后向前,删除2个 51 value: 要删除的值 52 ''' 53 # 这里要注意lrem在最新版本的redis中用法改了,将num与value调换位置了。(难怪我对着网上的博客写一致会报错~) 54 55 # 十一、ltrim(name, start, end) # 在name对应的列表中移除没有在start-end索引之间的值 56 conn.ltrim("l1", 0, 0) # 移除第一个以后的全部值 57 58 ret = conn.lrange("l1", 0, 100) 59 print(ret) 60 61 # 十二、rpoplpush(src, dst) # 从一个列表取出最右边的元素,同时将其添加至另外一个列表的最左边 62 """ 63 参数: 64 src,要取数据的列表的name 65 st,要添加数据的列表的name 66 """ 67 conn.lpush("l2", '11', '22', '33') 68 conn.lpush("l3", '44', '55', '66') 69 conn.rpoplpush("l2", "l3") 70 71 ret = conn.lrange("l3", 0, 100) 72 print(ret) 73 74 # redis都是玩的一些什么操做啊?花里胡哨~还有一部分反向操做的就不列出来了。要吐血了
1 # 一、sadd(name,values) # ame对应的集合中添加元素 2 3 # 二、smembers(name) # 获取name对应的集合的全部成员 4 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=1000) # 设置最大链接数量为1000 5 conn = redis.Redis(connection_pool=pool) # 链接链接池 6 7 conn.sadd("s1", "v1") 8 conn.sadd("s1", "v1", "v2", "v3", "v4", "v5") 9 10 print(conn.smembers("s1")) 11 >>>{b'v4', b'v5', b'v2', b'v1', b'v3'} # 获得一个无序集合 12 13 三、scard(name) # 获取name对应的集合中的元素个数 14 15 四、sdiff(keys, *args) # 在第一个name对应的集合中且不在其余name对应的集合的元素集合(差集) 16 conn.sadd("s2", "aa", "bb") 17 conn.sadd("s3", "bb", "cc") 18 conn.sadd("s4", "bb", "cc", "dd") 19 20 print(conn.sdiff("s2", "s3", "s4")) 21 >>>{b'aa'} 22 23 五、sinter(keys, *args) # 获取多个name对应集合的交集 24 conn.sadd("s2", "aa", "bb") 25 conn.sadd("s3", "bb", "cc") 26 conn.sadd("s4", "bb", "cc", "dd") 27 28 print(conn.sinter("s2", "s3", "s4")) 29 >>>{b'bb'} 30 31 六、sinterstore(dest, keys, *args) # 获取两个name对应集合的交集,并将结果存入第三个集合中 32 conn.sadd("s3", "bb", "cc") 33 conn.sadd("s4", "bb", "cc", "dd") 34 35 print(conn.sinterstore("s2", "s3", "s4")) # s2为一个空的store存储s3,s4的交集,返回数字 36 print(conn.smembers("s2")) # 返回集合中的值 37 38 七、sunion(keys, *args) # 并集,获取多个name对应的集合的并集 39 40 8、smove(src, dst, value) 41 conn.smove("s2", "s3", 'aa') 42 print(conn.smembers("s3")) 43 >>>{b'cc', b'aa', b'bb'} 44 45 九、sismember(name, value) # 判断是不是集合的成员 相似in 46 47 十、spop(name) # 删除--随机删除而且返回被删除值 48 49 十一、srem(name, values) # 删除--指定值删除 50 51 # 集合的操做相对最简单。
1 # 注意个人redis版本为3.2.1,python在操做有序集合中的部分源码已经改了,网上的一些博客抄来抄去,本身也不动手实践下,错的地方都同样。 2 3 一、zadd(name, mapping, nx=False, xx=False, ch=False, incr=False) # zadd的源码改了,网上大部分的博客都是旧的。因此输出的时候会报错 4 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=1000) # 设置最大链接数量为1000 5 conn = redis.Redis(connection_pool=pool) # 链接链接池 6 7 conn.zadd("z1", {"v11": 1, "v2": 2}) 8 print(conn.zrange("z1", 0, -1)) # 获取有序集合中全部元素 9 >>>[b'v11', b'v2'] # 返回一个列表 10 11 二、zcard(name) # 获取name对应的有序集合元素的数量 12 print(conn.zcard("z1")) 13 >>>2 14 15 三、zcount(name, min, max) # 获取name对应的有序集合中分数 在 [min,max] 之间的个数 16 17 四、zrange( name, start, end, desc=False, withscores=False, score_cast_func=float) # 按照索引范围获取name对应的有序集合的元素 18 """ 19 参数: 20 name,redis的name 21 start,有序集合索引发始位置(非分数) # 注意是索引 22 end,有序集合索引结束位置(非分数) 23 desc,排序规则,默认按照分数从小到大排序 24 withscores,是否获取元素的分数,默认只获取元素的值 25 score_cast_func,对分数进行数据转换的函数 26 """ 27 28 4.一、zrevrange(name, start, end, withscores=False, score_cast_func=float) # 从大到小排序(同zrange,集合是从大到小排序的) 29 4.二、zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float) # 按照分数范围获取name对应的有序集合的元素 30 4.三、zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float) # 按照分数范围获取有序集合的元素并排序(默认从大到小排序) 31 32 五、zscan(name, cursor=0, match=None, count=None, score_cast_func=float) # 获取全部元素--默认按照分数顺序排序 33 print(conn.zscan("z1")) 34 >>>(0, [(b'n1', 1.0), (b'v11', 1.0), (b'v2', 2.0)]) 35 36 5.一、zscan_iter(name, match=None, count=None,score_cast_func=float) # 获取全部元素--迭代器(这个很是有用) 37 print(conn.zscan_iter("z1")) 38 for i in conn.zscan_iter("z1"): 39 print(i) 40 41 >>><generator object Redis.zscan_iter at 0x00000010F26047D8> 42 (b'n1', 1.0) 43 (b'v11', 1.0) 44 (b'v2', 2.0) 45 46 六、zrem(name, values) # 删除--指定值删除 47 48 七、zremrangebyrank(name, min, max) # 删除--根据排行范围删除,按照索引号来删除 49 50 八、zscore(name, value) # 获取值对应的分数