第二节、Redis

作者: 妄语莫言 | 来源:发表于2018-02-02 16:00 被阅读0次
    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

        本文链接:https://www.haomeiwen.com/subject/afwkzxtx.html