概述:
>>>安装:
>>>数据类型:
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
>>>数据备份:redis 127.0.0.1:6379> SAVE
>>>设置密码:127.0.0.1:6379> CONFIG set requirepass "123456"
>>>性能测试:redis-benchmark -n 100000
>>>最大链接数:redis-server --maxclients 100000
>>>Redis是基于客户端-服务端模型 请求/响应的TCP服务
所以客户端通常是阻塞模式,等待服务端响应
Redis管道技术可以让客户端继续向服务端发送请求,最终一次性返回所有响应
>>>Redis分区,利用多台计算机内存,构建大型数据库
范围分区:ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推
哈希分区:crc32 hash函数-->key转换为一个数字-->93024922 % 4 = 2,存R2
面试题:
1 远程-非关系型数据库-内存-缓存
2 它可以用作数据库、缓存和消息中间件
3 速度快,丰富数据类型
4 redis常见性能问题和解决方案
Redis 是单进程单线程 利用队列技术将并发访问变为串行访问
命令:
String:
key - value(string/int/float)
-----set string1 ‘haha’
-----get string1
list:
key - [12,13,14,15] 左->右
-----lpush list1 12
-----lpop list1
-----llen list1
set:
key - [1,2,3,4] 无序
-----sadd set1 12
-----scard set1 查看
-----sismember set1 12 是否存在
------srem set1 删
hash:
key - key1 value(string/int/float)
key2 value(string/int/float)
key3 vlaue(string/int/float)
-----hset hash1 key1 12
-----hget hash1 key1
-----hlen hash1
sort set:
key - score(10.1) value(string/int/float) rank:1
score(9.9) value(string/int/float) rank:0
score(10.2) value(string/int/float) rank:2
----zadd zset1 12.2 val1
----zcart zset1 查
-----zrange zset1 0 2 withscores 排序
python-django应用:
'''缓冲redis''' import redis import pickle class PersonMetaclass(type): '''单例模式''' __instance = None def __call__(self, *args, **kwargs): if not self.__instance: self.__instance = super().__call__(*args, **kwargs) return self.__instance class Redis(object,metaclass=PersonMetaclass): '''共享缓存''' def __init__(self,host='127.0.0.1', port=6379, password='123456'): '''初始''' # 链接redis self._redis=redis.Redis(host=host, port=port, password=password) self.redis = self._redis def setString(self,*args): '''' aaa',1 ''' key,value = args self._redis.set(key,pickle.dumps(value)) def setList(self,*args): '''' names_list', *['fi', 'li'] ''' key, *v = args self._redis.lpush(key,pickle.dumps(*v)) map(lambda value: self._redis.lpush(key,pickle.dumps(value)),list(v)) def setSet(self): ''' key, *['fi', 1] ''' pass def setHash(self,name,**kwargs): ''' hash1,{k1:1,k2:2,} ''' keys,values = kwargs.items() map(lambda key,value:self._redis.hset(name, key, pickle.dumps(value)),list(keys),list(values)) def setSortSet(self,name,nx=False, xx=False, ch=False, incr=False,**kwargs): ''' key,[score:value:rank,] 设置任意数量的元素名称,将对的值设置为键 ' ' name ' ' '双指定为元素名称键的dict以获得值。 ' ' nx ' ' '强制ZADD只创建新元素,不更新 已经存在的元素的得分。 ' ' xx ' ' '强制ZADD只更新已经更新的元素的分数 存在。不会添加新元素。 ' ' ch ' '将返回值修改为已更改的元素数量。 更改的元素包括添加的新元素和元素 分数的改变。 ''' sorts, values = kwargs.items() map(lambda sort, value: self._redis.zadd(name, pickle.dumps(sort), nx=nx, xx=xx, ch=False, incr=incr), list(sorts), list(values)) def length(self,*args): ''' 长度 list ''' try: name,*name1 = args if args.__len__() == 1: return len(self.get(name)) return [ self._redis.llen(lens) for lens in args ] except: return None def int_or_str(value): '''''' def set(self,*args,TYPE=None, **kwargs): ''' 存入,String,list String:key->value(int,str,float) list: key->list--[] ''' try: a,*b = args if TYPE is not None: if TYPE == 'hash': self.setHash(a,**kwargs) elif TYPE == 'sort': self.setSortSet(a,**kwargs) elif len(b) == 1: self.setString(*args) elif len(b) > 1 : self.setList(*args) assert 'key error' except ValueError: return ValueError def get(self,name): ''' 取出 ''' try: return pickle.loads(self._redis.get(name)) except: return None def getList(self,name): try: return pickle.loads(self._redis.rpop(name)) except: return None def getHash(self,*args): try: name,key,*value = args return pickle.loads(self._redis.hmget(name,key,*value)) except: return None