第二节、Redis

Redis作用

Redis是nosql的非关系型数据库,一般部署在linux系统上,数据是保存在内存中,同时Redis可以定时的把内存数据同步到磁盘,提供了多种语言的API接口,可以将数据持久化,操作也比较方便,可以理解为是key-value的键值对应数据库
redis数据库命令不区分大小写,但是key和value注意区分

安装Redis

以乌班图系统为例,更新源后直接安装即可

pyvip@vip:~$  sudo apt-get update           
pyvip@vip:~$ sudo apt-get -y install redis-server

redis使用端口6379
配置文件/etc/redis/redis.conf
修改配置文件

pyvip@vip:~$ sudo vim  /etc/redis/redis.conf
42 daemonize yes
#设置yes默认在后台以守护进程方式运行
46 pidfile /var/run/redis/redis-server.pid
#记录进程pid号的文件路径,当运行多个redis服务时,需要指定不同的pid文件和端口
50 port 6379
#默认端口号,可以更改
69 bind 127.0.0.1
#指定redis只接收来自于该IP地址的请求,如果测试环境需要远程redis,需要更改为0.0.0.0,127.0.0.1的话只能本机访问
操作Redis

一般有两种方式操作Redis

  • 直接使用客户端redis-cli
#本地登录
pyvip@vip:~$ redis-cli
127.0.0.1:6379> exit
#远程登录
pyvip@vip:~$ redis-cli -h 192.168.X.X  -p 6379
  • 使用汇编语言调用如python、java等
Redis五种基本数据类型
  • string 字符串
  • list 列表
  • hash 哈希
  • set 集合
  • sorted sets 有序集合
redis中字符串的相关操作
#为某个key赋值字符串格式:set  key  value,key键必须是唯一的,如果重复会覆盖之前的值,且过期时间默认是永不过期,字符串最好用单引号包起来(字符串里存在空格)
127.0.0.1:6379> set name 'hello allan'
OK
#获取key的值value,格式:get key
127.0.0.1:6379> get name
"hello allan"
#设置key的过期时间
#key实际存在时格式:expire key seconds单位是秒
127.0.0.1:6379> expire name 30
(integer) 1
#查看过期时间,过期后key的值返回nil即空
127.0.0.1:6379> ttl name
(integer) 26
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
#当key不存在赋值的同时指定过期时间,格式:set key value ex seconds
127.0.0.1:6379> set na "hell word" ex 60
OK
127.0.0.1:6379> ttl na
(integer) 54
127.0.0.1:6379> get na
"hell word"
#给key追加内容格式:append key value,  integer表示字符串长度
127.0.0.1:6379> append name "lili"
(integer) 9
127.0.0.1:6379> get name
"allanlili"
#同时赋值多个key及获取多个key,mset,mget语法格式类似
127.0.0.1:6379> mset username "alex" passwd "qwer"
OK
127.0.0.1:6379> mget username passwd
1) "alex"
2) "qwer"
#查看所有的key
127.0.0.1:6379> keys *
1) "passwd"
2) "username"
3) "name"
#查询key是否存在,格式:exists key
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists nb
(integer) 0
#删除key格式:del key只能逐个依次删除
127.0.0.1:6379> del name
(integer) 1
#查询类型格式:type key
127.0.0.1:6379> type passwd
string
#运算设置key为1,进行加减运算
127.0.0.1:6379> set rc 1
OK
127.0.0.1:6379> incr rc
(integer) 2
127.0.0.1:6379> incr rc
(integer) 3
127.0.0.1:6379> decr rc
(integer) 2
127.0.0.1:6379> get rc
"2"
#加减整数格式:incrby/decrby  key  整数值
127.0.0.1:6379> incrby rc 100
(integer) 102
127.0.0.1:6379> decrby rc 50
(integer) 52
127.0.0.1:6379> get rc
"52"
redis中的列表list相关操作
#左添加lpush
#右添加rpsuh
#查看lrange根据列表下标查看,两个下标(开始和结束)确定查看范围
#根据下标查看lindex key index
127.0.0.1:6379> rpush my_list 1 2 3
(integer) 3
127.0.0.1:6379> lpush my_list 4 5 6
(integer) 6
127.0.0.1:6379> type my_list
list
127.0.0.1:6379> lrange my_list 0 -1
1) "6"
2) "5"
3) "4"
4) "1"
5) "2"
6) "3"
127.0.0.1:6379> lrange my_list 0 0
1) "6"
127.0.0.1:6379> lrange my_list 0 1
1) "6"
2) "5"
127.0.0.1:6379> lindex my_list 1
"5"
#查看列表元素个数llen
127.0.0.1:6379> llen my_list
(integer) 6
#删除左边第一个元素lpop
#删除右边第一个元素rpop
#删除指定元素lrem
lrem key count value
count>0从左向右删除count个数的元素
count<0从右向左删除count个数的元素
count=0删除所有
127.0.0.1:6379> lrem key 0 5
#删除列表中所有的5
127.0.0.1:6379> lrem key 2 5
#从左向右删除列表中2个5
redis中的哈希hash相关操作

json的格式

#设置hset格式:hset key filed value
#获取gset
#删除hdel
#设置多个hmset
127.0.0.1:6379> hset user username allan
(integer) 1
127.0.0.1:6379>  hset user age 18
(integer) 1
127.0.0.1:6379> type user
hash
127.0.0.1:6379> hget user username
"allan"
#查看 全部
127.0.0.1:6379> hgetall user
1) "username"
2) "allan"
3) "age"
4) "18"
#获取所有filed,hkeys
#获取所有value,hvals
#获取filed个数,hlen
127.0.0.1:6379> hmset web baidu baidu.com  qq  qq.com
OK
127.0.0.1:6379> hkeys web
1) "baidu"
2) "qq"
127.0.0.1:6379> hvals web
1) "baidu.com"
2) "qq.com"
127.0.0.1:6379> hlen web
(integer) 2
127.0.0.1:6379> hmget web baidu qq
1) "baidu.com"
2) "qq.com"
redis中的集合set相关操作
#设置sadd key value value集合会去重且无序
#获取smembers key
127.0.0.1:6379> sadd mset 1 1 1
(integer) 1
127.0.0.1:6379> sadd mset 2 4 5
(integer) 3
127.0.0.1:6379> smembers mset
1) "1"
2) "2"
3) "4"
4) "5"
#随机删除spop key
#指定删除srem key member
127.0.0.1:6379> srem mset 1
(integer) 1
127.0.0.1:6379> spop mset
"4"
127.0.0.1:6379> smembers mset
1) "2"
2) "5"
#将集合中元素移动到另一个集合smove  oldkey  newkey  value
#交集 sinter  key1  key2
#并集 sunion  key1  key2
#差集 sdiff  key1  key2
#判断集合中是否存在某个值sismember key value
#获取集合元素个数scard key
#随机抽取集合元素返回srandmember key
redis中的有序集合zset相关操作
#设置zadd key score member在元素前面添加了排序的依据如:
#正序查看zrange key start stop
#反序查看zrevrange key start stop
127.0.0.1:6379> zadd nset 100 z  50 a  1 h
(integer) 3
127.0.0.1:6379> type nset
zset
127.0.0.1:6379> zrange nset 0 -1
1) "h"
2) "a"
3) "z"
127.0.0.1:6379> zrevrange nset 0 -1
1) "z"
2) "a"
3) "h"
#删除zrem key member
#正序查询集合中元素的下标索引 zrank key member
#反序查询集合中元素的下标索引 zrevrank key member
127.0.0.1:6379> zrevrank nset z
(integer) 0
127.0.0.1:6379> zrank nset z
(integer) 2
#查看元素个数zcard key
127.0.0.1:6379> zcard nset
(integer) 3
#查询元素的排序依据 zscore key member
127.0.0.1:6379> zscore nset z
"100"
#查询返回值(排序依据)在某个区间的元素个数zcount key  min  max
127.0.0.1:6379> zcount nset 1 50
(integer) 2
Redis的发布和订阅

消息的发布一般针对同一台服务器上的多个用户,如3个用户同时通过xshell远程打开同一台服务器的redis
用户需要先订阅 subscribe频道号才能接收到其他用户在该频道发布publish的消息,订阅端是实时接收消息

#订阅频道aaa
127.0.0.1:6379> subscribe aaa
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "aaa"
3) (integer) 1
#另一个终端发布消息
127.0.0.1:6379> publish aaa  hi
(integer) 1
#订阅端接收消息如下
127.0.0.1:6379> subscribe aaa
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "aaa"
3) (integer) 1
1) "message"
2) "aaa"
3) "hi"
#取消订阅 unsubscribe 频道名
python调用redis
  • 设置redis密码限制操作
#修改配置文件
pyvip@vip:~$ sudo vim /etc/redis/redis.conf 
[sudo] password for pyvip: 
396 # requirepass foobared
397 requirepass allan
#重启服务
 pyvip@vip:~$ sudo service redis-server restart 
#登录redis时设置key赋值以及其他操作都会报错如下
127.0.0.1:6379> set nn b
(error) NOAUTH Authentication required.
#输入密码操作
127.0.0.1:6379> auth allan
OK
  • python调用
#修改配置文件开放远程连接
pyvip@vip:~$ sudo vim /etc/redis/redis.conf 
 69 # bind 127.0.0.1
 70 bind 0.0.0.0
#重启服务
 pyvip@vip:~$ sudo service redis-server restart 
#安装第三方库redis,先切换py3en虚拟工作环境
(py3env) pyvip@vip:~$ pip install redis
  • 在pycham的项目中进行设置,同时在vmwork station上设置端口转发,将虚拟机的6379端口转发为4567,如果python使用的就是远程虚拟机环境就不需要端口转发
#python代码
#导入模块
import redis
#建立连接,主机localhost,端口6379
r = redis.Redis(host='localhost',port=6379)
#设置实例key=aaaaa,value=hello world
r.set('aaaaa','hello world')
#根据key获取value
print(r.get('aaaaa'))
#python运行结果可以取到对应的value值
b'hello world'
#运行后进入虚拟机查看redis里面key已正常写入
127.0.0.1:6379> get aaaaa
"hello world"
#python输出的类型是byte类,中文需要解码
r.set('hello','你好')
print(r.get('hello'))
#输出b'\xe4\xbd\xa0\xe5\xa5\xbd'
#添加解码语句 
print(r.get('hello').decode('utf-8'))
#输出你好

你可能感兴趣的:(第二节、Redis)