非关系型数据库简介:
-随着访问量的上升,网站的数据库性能出现了问题,于是非关系型数据库就被设计出来
-优缺点
--优点:
高可扩展性 分布式计算 低成本
架构的灵活性,半结构化数据
--缺点:
没有标准化 有限的查询功能
Redis数据类型–基础
redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)
官方文档--命令查询:http://redis.cn/commands.html
(一)string字符串
字符串类型是Redis最基本的数据类型,一个键最大能存储512MB
-同时字符串类型是二进制安全的,也就意味着字符串可以包含任何数据,比如jpg图片或序列化对象
1.创建数据
设置键值
set key value #set name 'sun'
设置键值及过期时间,以秒为单位
setex key seconds value #setex name 2 'sun'
设置多个键值
mset key value[key value] #mset name 'sun' age 18
2.获取键值
根据键获取值,若没有此键则返回nil
get key #get name
根绝多个键获取多个值
mget key[key..] #mget name age address gender
3.运算—要求值必须是数字
将key对应的value加1
incr key #incr age
将key对应的value加整数
incrby key increment #incrby key 12
将key对应的value减1
decr key #decr age
将key对应的value减整数
decrby key decrement #decrby age 8
4.键的查判
查找键,参数支持正则
keys pattern #keys * 查找当前库所有的键
判断键是否存在,存在返回1,不存在返回0
exists key #exists hobby
#删除键及对应的值
del key #del address
5.追加值
append key value #append name 'handsome'
获取值得长度 strlen key #strlen name
(二)hash哈希
-redis hash是一个键值对集合,是一个string类型的field和 value的映射表,hash特别适合存储对象
1.创建数据
设置单个属性
hset key field value #hset car name bmw
设置多个属性
hmset key field value[field value] #hset car color white price 100
2.获取数据
获取单个属性的值
hget key field #hget car name
获取多个属性的值
hmget key field[field...] #hmget car name price color
获取所有属性和值
hgetall key #hgetall car
获取所有属性
hkeys key #hkeys car
获取所有值
hvals key #hvals car
3.属性的查判
#判断属性是否存在
hexists key field
删除属性及值
hdel key field [field..]
(三)list列表
redis list是简单的string类型的列表,按照插入顺序排序。
1.创建数据
在头部插入数据
lpush key value[value..] #lpush username 'xiaoming'
在尾部插入数据
rpush key value[value..] #rpush userjob 'teacher'
在一个元素的前或后插入值
linsert key before(after) pivot value
#rpush mylist 'hello'
rpush mylist 'world'
linsert mylist before 'world' 'great'
2.获取数据
出并且返回key对应的list的第一个元素
lpop key #lpop username
--移除并返回key的list的最后一个元素
rpop key #rpop mylist
--返回存储在key的列表里指定范围内的元素
start和end偏移量都是基于0的下标
lrange key start end #lrange mylist 0 -1
(四)set集合
redis set是string类型的无序集合;元素具有唯一性,不重复
1.创建数据
sadd key member[member..] #sadd myadd 1 2 3 4
2.获取数据
-返回key集合所有的元素
smembers key #smembers myadd
-返回集合元素的个数
scard key #scard myadd
(五)zset集合
-redis zset也是string类型的元素的集合,但每个元素会根据权重进行从小到大的排序。
1.创建数据
zadd key score member[ score member..]
score是一个double类型的权重值
#zad myzadd 1 'food' 2 'game' 3 music'
2.获取数据
-返回指定范围的元素
zrange key start stop #zrange myzadd 0 -1
-返回元素个数
zcard key #zcard myzadd
数据传递的两种方式
发布订阅
客户端发布频道的消息,将会被推送到所有订阅测频道的客户端
--订阅 subscribe 频道名[频道名..]
unsubscribe 频道名(取消频道)
--发布
publish 频道 消息
注意:这个是在同一个IP下,不同客户端完成操作的
–主从配置
-修改配置文件
设置主服务器 bind xxxx(主服务器IP)
设置从服务器 bind xxx(从服务器IP)
slaveof xxx主服务器IP 6379 (注意添加端口号)
-在master上写数据
set hello world
-在slave上读数据
get hello
在python中的应用
–StrictRedis方法
import redis
#建立连接
r=redis.StrictRedis(host='localhost',port=6379)
#根据数据类型不同,调用不同的方法,完成读写
r.set('name','sun')
r.get('name').decode(encoding='utf-8') #返回的是一个字节组,因此需要解码
–pipeline方法
#该方法可以缓冲多条命令,然后一次性进行执行,减少客户端-服务器之间TCP数据库包,从而提高效率
import redis
r=redis.StrictRedis(host='localhost',port=6379)
pipe=r.pipeline()
pipe.set('address','SH')
pip.get('name')
pip.execute()
–封装
import redis
class RedisHelper():
def __init__(self,host='localhost',port=6379):
self.__redis=redis.StrictRedis(host,port)
def get(self,key):
if self.__redis.exists(key):
return self.__redis.get(key)
else:
return ""
def set(self,key,value):
self.__redis.set(key,value)
r=RedisHelper()
r.set('me','handsome')
r.get('me')