Redis
目录
NoSQL:一类新出现的数据库(not only sql),它的特点:
-
不支持SQL语法
-
存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式
-
NoSQL的世界中没有一种通用的语言,每种nosql数据库都有自己的api和语法,以及擅长的业务场景
-
NoSQL中的产品种类相当多:
-
Mongodb
-
Redis
-
Hbase hadoop
-
Cassandra hadoop
-
NoSQL和SQL数据库的比较:
-
适用场景不同:sql数据库适合用于关系特别复杂的数据查询场景,nosql反之
-
“事务”特性的支持:sql对事务的支持非常完善,而nosql基本不支持事务
-
两者在不断地取长补短,呈现融合趋势
Redis简介
-
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
-
Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色
Redis特性
-
Redis 与其他 key - value 缓存产品有以下三个特点:
-
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
-
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
-
Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
redis应用场景
-
用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的(内存数据库)
-
可以在某些特定应用场景下替代传统数据库——比如社交类的应用
-
在一些大型系统中,巧妙地实现一些特定的功能:session共享、购物车
-
只要你有丰富的想象力,redis可以用在可以给你无限的惊喜…….
-
step1:下载
-
step2:解压
- tar -zxvf redis-3.2.8.tar.gz
-
step3:复制,放到usr/local⽬录下
- sudo mv ./redis-3.2.8 /usr/local/redis/
-
step4:进⼊redis⽬录
- cd /usr/local/redis/
-
step5:生成
- sudo make
-
step6:测试,这段运⾏时间会较⻓
- sudo make test
- step7:安装,将redis的命令安装到/usr/local/bin/⽬录
- sudo make install
-
step8:安装完成后,我们进入目录/usr/local/bin中查看
- cd /usr/local/bin
ls -all -
- redis-server redis服务器
- redis-cli redis命令行客户端
- redis-benchmark redis性能测试工具
- redis-check-aof AOF文件修复工具
- redis-check-rdb RDB文件检索工具
- cd /usr/local/bin
-
step9:配置⽂件,移动到/etc/⽬录下
- 配置⽂件⽬录为/usr/local/redis/redis.conf
- sudo cp /usr/local/redis/redis.conf /etc/redis/
-
Redis的配置信息在/etc/redis/redis.conf下。
- 查看
-
sudo vi /etc/redis/redis.conf
-
核心配置选项
- 绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip
-
bind 127.0.0.1
-
- 端⼝,默认为6379
-
port 6379
-
-
是否以守护进程运⾏
- 如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
- 如果以⾮守护进程运⾏,则当前终端被阻塞
- 设置为yes表示守护进程,设置为no表示⾮守护进程
- 推荐设置为yes
-
daemonize yes
-
- 数据⽂件
-
dbfilename dump.rdb
-
- 数据⽂件存储路径
-
dir /var/lib/redis
-
- ⽇志⽂件
-
logfile /var/log/redis/redis-server.log
-
- 数据库,默认有16个
-
database 16
-
- 主从复制,类似于双机备份。
-
slaveof
-
服务器端
-
服务器端的命令为redis-server
- 可以使⽤help查看帮助⽂档
-
redis-server --help
-
- 推荐使⽤服务的⽅式管理redis服务
- 启动
-
sudo service redis start
-
- 停⽌
-
sudo service redis stop
-
- 重启 sudo service redis restart
- 个人习惯
-
ps -ef|grep redis 查看redis服务器进程 sudo kill -9 pid 杀死redis服务器 sudo redis-server /etc/redis/redis.conf 指定加载的配置文件
-
客户端
- 客户端的命令为redis-cli
- 可以使⽤help查看帮助⽂档
-
redis-cli --help
-
-
连接redis
-
redis-cli
-
-
运⾏测试命令
-
ping
-
-
切换数据库
-
数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库
-
select n
-
string类型
- 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
保存
如果设置的键不存在则为添加,如果设置的键已经存在则修改
-
设置键值
-
set key value
-
-
设置键值及过期时间,以秒为单位
-
setex key seconds value
-
-
设置多个键值
-
mset key1 value1 key2 value2 ...
-
-
追加值
-
append key value
-
获取
-
获取:根据键获取值
-
get key
-
-
根据多个键获取多个值
-
mget key1 key2 ...
-
-
查找键,参数⽀持正则表达式
-
keys pattern 例1:查看所有键 : keys * 例2:查看名称中包含a的键: keys 'a*'
-
-
判断键是否存在,如果存在返回1,不存在返回0
-
exists key1
-
-
查看键对应的value的类型
-
type key
-
-
删除键及对应的值
-
del key1 key2 ...
-
-
设置过期时间,以秒为单位
-
如果没有指定过期时间则⼀直存在,直到使⽤DEL移除
-
expire key seconds
-
-
查看有效时间,以秒为单位
-
ttl key
-
- hash⽤于存储对象,对象的结构为属性、值
- 值的类型为string
增加、修改
-
设置单个属性
-
hset key field value
-
-
设置多个属性
-
hmset key field1 value1 field2 value2 ...
-
获取
-
获取指定键所有的属性
-
hkeys key
-
-
获取⼀个属性的值
-
hget key field
-
-
获取多个属性的值
-
hmget key field1 field2 ...
-
-
获取所有属性的值
-
hvals key
-
删除
- 删除整个hash键及值,使⽤del命令
-
删除属性,属性对应的值会被⼀起删除
-
hdel key field1 field2 ...
-
- 列表的元素类型为string
- 按照插⼊顺序排序
增加
-
在左侧插⼊数据
-
lpush key value1 value2 ...
-
-
在右侧插⼊数据
-
rpush key value1 value2 ...
-
-
在指定元素的前或后插⼊新元素
-
linsert key before或after 现有元素 新元素
-
获取
-
返回列表⾥指定范围内的元素
- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
-
lrange key start stop
-
设置指定索引位置的元素值
- 索引从左侧开始,第⼀个元素为0
-
索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
-
lset key index value
-
删除
-
删除指定元素
- 将列表中前count次出现的值为value的元素移除
- count > 0: 从头往尾移除
- count < 0: 从尾往头移除
- count = 0: 移除所有
-
lrem key count value
-
- ⽆序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
- 说明:对于集合没有修改操作
增加
-
添加元素
-
sadd key member1 member2 ...
-
获取
-
返回所有的元素
-
smembers key
-
删除
-
删除指定元素
-
srem key
-
-
sorted set,有序集合
-
元素为string类型
-
元素具有唯⼀性,不重复
-
每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
-
说明:没有修改操作
增加
-
添加
-
zadd key score1 member1 score2 member2 ...
-
获取
-
返回指定范围内的元素
-
start、stop为元素的下标索引
-
索引从左侧开始,第⼀个元素为0
-
索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
-
zrange key start stop
-
-
返回score值在min和max之间的成员
-
zrangebyscore key min max
-
-
返回成员member的score值
-
zscore key member
-
删除
-
删除指定元素
-
zrem key member1 member2 ...
-
-
删除权重在指定范围的元素
-
zremrangebyscore key min max
-
StrictRedis对象⽅法
- 通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0
sr = StrictRedis(host='localhost', port=6379, db=0) 简写 sr=StrictRedis()
- 根据不同的类型,拥有不同的实例⽅法可以调⽤,与前⾯学的redis命令对应,⽅法需要的参数与命令的参数⼀致
string
-
set
-
setex
-
mset
-
append
-
get
-
mget
-
key
keys
-
exists
-
type
-
delete
-
expire
-
getrange
-
ttl
hash
-
hset
-
hmset
-
hkeys
-
hget
-
hmget
-
hvals
-
hdel
list
-
lpush
-
rpush
-
linsert
-
lrange
-
lset
-
lrem
set
-
sadd
-
smembers
-
srem
zset
-
zadd
-
zrange
-
zrangebyscore
-
zscore
-
zrem
-
zremrangebyscore
- 在桌面上创建redis目录
- 使用pycharm打开 redis目录
- 创建redis_string.py文件
from redis import * if __name__=="__main__": try: #创建StrictRedis对象,与redis服务器建⽴连接 sr=StrictRedis() except Exception as e: print(e)
string-增加
- ⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
- 编写代码如下
from redis import * if __name__=="__main__": try: #创建StrictRedis对象,与redis服务器建⽴连接 sr=StrictRedis() #添加键name,值为zorro result=sr.set('name','zorro') #输出响应结果,如果添加成功则返回True,否则返回False print(result) except Exception as e: print(e)
string-获取
- ⽅法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None
- 编写代码如下
from redis import * if __name__=="__main__": try: #创建StrictRedis对象,与redis服务器建⽴连接 sr=StrictRedis() #获取键name的值 result = sr.get('name') #输出键的值,如果键不存在则返回None print(result) except Exception as e: print(e)
string-修改
- ⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
- 编写代码如下
from redis import * if __name__=="__main__": try: #创建StrictRedis对象,与redis服务器建⽴连接 sr=StrictRedis() #设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加 result = sr.set('name','luffy') #输出响应结果,如果操作成功则返回True,否则返回False print(result) except Exception as e: print(e)
string-删除
- ⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返 回0
- 编写代码如下
from redis import * if __name__=="__main__": try: #创建StrictRedis对象,与redis服务器建⽴连接 sr=StrictRedis() #设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加 result = sr.delete('name') #输出响应结果,如果删除成功则返回受影响的键数,否则则返回0 print(result) except Exception as e: print(e)
获取键
- ⽅法keys,根据正则表达式获取键
- 编写代码如下
from redis import * if __name__=="__main__": try: #创建StrictRedis对象,与redis服务器建⽴连接 sr=StrictRedis() #获取所有的键 result=sr.keys() #输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表 print(result) except Exception as e: print(e)
session的redis存储配置
-
安装包
-
pip install django-redis-sessions
-
-
修改settings文件,增加如下项
-
SESSION_ENGINE = 'redis_sessions.session' SESSION_REDIS_HOST = 'localhost' SESSION_REDIS_PORT = 6379 SESSION_REDIS_DB = 2 SESSION_REDIS_PASSWORD = '' SESSION_REDIS_PREFIX = 'session'
-
测试
- 打开booktest/views.py文件,创建session_set和session_get视图如下
def session_set(request): request.session['name']='luffy' return HttpResponse('ok') def session_get(request): name=request.session['name'] return HttpResponse(name)
- 打开booktest/urls.py文件,配置url如下
url(r'^session_set/$',views.session_set), url(r'^session_get/$', views.session_get),
-
通过redis-cli客户端查看
-
Base64在线解码http://base64.xpcha.com/