数据库 | 初识Redis 1



Redis简介

  • Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

  • 从2010年3月15日起,Redis的开发工作由VMware主持

  • Redis是一个开源(BSD许可)的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件

  • Redis是一个高性能的key-value存储系统
    和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便

  • Redis支持主从同步
    数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助

参阅:

  • Redis官网命令参考
  • Redis中文官网命令参考

一、安装Redis

默认端口6379

  • yum安装最新版redis
    yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    yum --enablerepo=remi install redis -y

提醒:

  • yum直接安装的redis不是最新版
    yum install redis -y(非最新版)

  • redis软件源

最新软件源 地址
官网 http://rpms.remirepo.net/
CentOS http://rpms.remirepo.net/enterprise/

参阅:

  • centos7 yum install redis
  • 利用yum安装与使用Redis的方法详解_Redis
  • yum的--enablerepo选项是否仅启用当前命令的仓库?
  • 查看redis版本
    redis-cli -v
  • 检查redis安装相关的文件

rpm -qa |grep redis

rpm -ql redis

  • redis服务管理
管理 命令1 命令2
开启 service redis start systemctl start redis
关闭 service redis stop systemctl stop redis
重启 service redis restart systemctl restart redis
查看 service redis status systemctl status redis
  • 配置redis
  1. 开机自启动
    chkconfig redis on

    systemctl enable redis.service

  2. redis配置文件

查看配置
cat /etc/redis.conf | grep -vE '#|^$'

修改配置
vim /etc/redis.conf

(1) 开启远程登录

提示:

  • 注释或更改ip

(2) 开启守护进程

如果以守护进程运行,则不会在命令行阻塞,类似于服务
如果以非守护进程运行,则当前终端被阻塞
设置为yes表示守护进程,设置为no表示非守护进程
推荐设置为yes

提示:

  • 如果以守护进程运行,则不会在命令行阻塞,类似于服务
  • 如果以非守护进程运行,则不会阻塞当前终端
  • 设置为yes表示守护进程,设置为no表示非守护进程
  • 推荐设置为yes

(3) 关闭保护模式

提醒:

  • 生产环境中应该更换端口,避免黑客攻击

参阅:

  • Redis daemonize介绍
  • 连接redis
    redis-cli

二、使用Redis

1.1 客户端与服务端

Redis 服务端 客户端
命令 redis-server redis-cli
帮助文档 redis-server --help redis-cli --help
其他 切换数据库 select 1

运行测试 ping

提示:

  • 数据库没有名称,默认有16个,通过0-15来标识

1.2 数据操作

  • redis是key-value的数据结构,每条数据都是一个键值对
  • 键的类型是字符串
  • 键不能重复

值的类型分为五种:
➢ 字符串 string
➢ 哈希 hash
➢ 列表 list
➢ 集合 set
➢ 有序集合 zset

1.2.1 字符串 string

  • string是redis最基本的类型
  • 最大能存储512MB数据
  • string类型是二进制安全的,可以存储任何数据,比如数字、图片等
数据操作 说明
如果设置的键不存在则为添加,如果设置的键已经存在则修改

(1) 设置键值

格式:set key value

eg:

设置键为'py1'值为'gj'的数据

set py1 gj

(2) 设置键值及过期时间,以秒为单位

格式:setex key seconds value

eg:

设置键为'py2'值为'hr'过期时间为3秒的数据

setex py2 3 hr

(3) 设置多个键值

格式:mset key1 value1 key2 value2 ...

eg:

设置键为'py3'值为'dx'、键为'py4'值为'xd'、键为'py5'值为'nd'、键为'py6'值为'bg'的数据

mset py3 dx py4 xd py5 nd py6 bg
见下节键的操作,删除键时会将值删除
(1)追加值

格式:append key value

eg:

向键为py1中追加值'haha'

append py1 haha
(1)获取:根据键获取值,如果不存在此键则返回nil

格式:get key

eg:

获取键'py1'的值

get py1



(2) 根据多个键获取多个值

格式:mget key1 key2 ...

eg:

获取键'py3'、'py4'、'py5'、'py6'的值

mget py3 py4 py5 py6

1.2.2 键命令

数据操作 说明
(1) 删除键及对应的值

格式:del key1 key2 ...

eg:

删除键'py3'、'py4'、'py5'、'py6'

del py3 py4 py5 py6
(1) 设置过期时间,以秒为单位

如果没有指定过期时间则一直存在,直到使用DEL移除

格式:expire key seconds

eg:

设置键'py1'的过期时间为10秒

expire py1 10
查找键,参数通配符查找

格式:keys pattern

(1) 查看所有键

格式:keys *



eg:

查看名称中包含1的键

keys *1*



(2) 判断键是否存在,如果存在返回1,不存在返回0

格式:exists key1

eg:

判断键'py1'、'py2'是否存在

exists py1
exists py2



(3) 查看键对应的value的类型

格式:type key

eg:

查看键'py1'的值类型,为redis支持的五种类型中的一种

type py1



(4) 查看有效时间,以秒为单位

格式:ttl key

eg:

查看键'py2'的有效时间

ttl py2



  • 删除所有key
  1. 删除当前数据库中的所有Key
    flushdb

  2. 删除所有数据库中的Key
    flushall

参阅:

  • 批量删除Key

1.2.3 哈希 hash

  • hash用于存储对象,对象的结构为属性、值
  • 值的类型为string
数据操作 说明
(1) 删除整个hash键及值,使用del命令

格式:hdel key field1 field2 ...

eg:

删除键'py3'的属性'gender'、'birthday'

hdel py3 gender birthday

(1) 设置单个属性

格式:hset key field value

eg:

设置键'py2'的属性'name'为'hr'

hset py2 name hr

(2) 设置多个属性

格式:hmset key field1 value1 field2 value2 ...

eg:

设置键'py3'的属性'name'为'dx'、属性'gender'为'1'、属性'birthday'为'2017-1-1'

hmset py3 name dx gender 1 birthday 2017-1-1

(1) 获取指定键所有的属性

格式:hkeys key

eg:

获取键'py3'的所有属性

hkeys py3



(2) 获取一个属性的值

格式:hget key field

eg:

获取键'py2'属性'name'的值

hget py2 name



(3) 获取多个属性的值

格式:hmget key field1 field2 ...

eg:

获取键'py3'属性'name'、'gender'、'birthday'的值

hmget py3 name gender birthday



(4) 获取所有属性的值

格式:hvals key

eg:

获取键'py3'所有属性的值

hvals py3

1.2.4 列表 list

  • 列表的元素类型为string
  • 按照插入顺序排序
数据操作 说明
(1) 在左侧插入数据

格式:lpush key value1 value2 ...

eg:

从键为'py11'的列表左侧加入数据'dx'、'xd'

lpush py11 dx xd

(2) 在右侧插入数据

格式:rpush key value1 value2 ...

eg:

从键为'py11'的列表右侧加入数据'nd'、'bg'

rpush py11 nd bg

(3) 在指定元素的前或后插入新元素

格式:linsert key before|after [现有元素] [新元素]

eg:

在键为'py11'的列表中元素'nd'前加入'zbt'

linsert py11 before nd zbt
(1) 删除指定元素

➢ 将列表中前count次出现的值为value的元素移除

➢ count > 0: 从头往尾移除

➢ count < 0: 从尾往头移除

➢ count = 0: 移除所有

格式:lrem key count value

eg:

向列表'py12'中加入元素'h0'、'h1'、'h2'、'h0'、'h1'、'h3'、'h0'、'h1'

rpush py12 h0 h1 h2 h0 h1 h3 h0 h1

从'py12'列表右侧开始删除2个'h0'

lrem py12 -2 h0

查看列表'py12'的所有元素

lrange py12 0 -1

(1) 设置指定索引位置的元素值

➢ 索引从左侧开始,第一个元素为0

➢ 索引可以是负数,表示尾部开始计数,如-1表示最后一个元素

格式:lset key index value

eg:

修改键为'py11'的列表中下标为1的元素值为'xidu'

lset py11 1 xidu

(1) 返回列表里指定范围内的元素

➢ start、stop为元素的下标索引

➢ 索引从左侧开始,第一个元素为0

➢ 索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素

格式:lrange key start stop

eg:

获取键为'py11'的列表所有元素

lrange py11 0 -1



1.2.5 集合 set

  • 无序集合
  • 元素为string类型
  • 元素具有唯一性,不重复
  • 对于集合没有修改操作
数据操作 说明
(1) 添加元素

格式:sadd key member1 member2 ...

eg:

向键'py21'的集合中添加元素'yg'、'xln'、'yzp'

sadd py21 yg xln yzp
(1) 删除指定元素

格式:srem key member

eg:

删除键'py21'的集合中元素'yzp'

srem py21 yzp
——
(1) 返回所有的元素

格式:smembers key

eg:

获取键'py21'的集合中所有元素

smembers py21

1.2.6 有序集合 zset

  • sorted set,有序集合
  • 元素为string类型
  • 元素具有唯一性,不重复
  • 每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序
  • 没有修改操作
数据操作 说明
(1) 添加

格式:zadd key score1 member1 score2 member2 ...

eg:

向键'py31'的集合中添加元素'gj'、'hr'、'yg'、'xln',权重分别为1、5、8、3

zadd py31 1 gj 5 hr 8 yg 3 xln
(1) 删除指定元素

格式:zrem key member1 member2 ...

eg:

删除集合'py31'中元素'yg'

zrem py31 yg

(2) 删除权重在指定范围的元素

格式:zremrangebyscore key min max

eg:

删除集合'py31'中权限在4、9之间的元素

zremrangebyscore py31 4 9
——
(1) 返回指定范围内的元素

➢ start、stop为元素的下标索引

➢ 索引从左侧开始,第一个元素为0

➢ 索引可以是负数,表示从尾部开始计数,如-1表示最后一个元素

格式:zrange key start stop

eg:

获取键'py31'的集合中所有元素

zrange py31 0 -1



(2) 返回score值在min和max之间的成员

格式:zrangebyscore key min max

eg:

获取键'py31'的集合中权限值在4和9之间的成员

zrangebyscore py31 4 9



(3) 返回成员member的score值

格式:zscore key member

eg:

获取键'py31'的集合中元素'yg'的权重

zscore py31 yg

提示:

  • 高级类型向下存储为基本类型没有错误
  • 基本类型向上存储为高级类型就会失败
  • 不同高级类型之间使用相同的key值存储数据会失败

  • hash(高级类型)=(key值)=>string(基本类型) 成功

eg:
flushdb
hset stu1 name yy
set stu1 yy

  • string(基本类型)=(key值)=>hash(高级类型) 失败

eg:
flushdb
set stu1 yy
hset stu1 name yy

  • hash(高级类型)=(key值)=>list(高级类型) 失败

eg:
flushdb
hset stu1 name yy
lpush stu1 A B C

1.3 与Python交互

1.3.1 安装redis库

yum install pip-python
pip install redis

1.3.2 调用模块

  • 引入模块
    from redis import *

这个模块中提供了StrictRedis对象,用于连接redis服务器,并按照不同类型提供了不同方法,进行交互操作

1.3.4 方法

StrictRedis对象方法

  • 通过init创建对象,指定参数host、port与指定的服务器和端口连接,host默认为localhost,port默认为6379
  • 根据不同的类型,拥有不同的实例方法可以调用,与前面学的redis命令对应,方法需要的参数与命令的参数一致

1. string

  • set
  • setex
  • mset
  • append
  • get
  • mget
  • key
  • keys
  • exists
  • type
  • delete
  • expire
  • getrange
  • ttl

2. hash

  • hset
  • hmset
  • hkeys
  • hget
  • hmget
  • hvals
  • hdel

3. list

  • lpush
  • rpush
  • linsert
  • lrange
  • lset
  • lrem

4. set

  • sadd
  • smembers
  • srem

5. zset

  • zadd
  • zrange
  • zrangebyscore
  • zscore
  • zrem
  • zremrangebyscore

1.3.4 String

1. 增

增加

  • 方法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
  • 创建文件redis_add.py,编写代码如下
#coding=utf-8
from redis import *

if __name__=="__main__":
    try:
        #创建StrictRedis对象,与redis服务器建立连接
        sr=StrictRedis()
        #添加键py1,值为gj
        result=sr.set('py1','gj')
        #输出响应结果,如果添加成功则返回True,否则返回False
        print result
    except Exception as e:
        print e

2. 删

删除

  • 方法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返回0
  • 创建文件redis_delete.py,编写代码如下
#coding=utf-8
from redis import *

if __name__=="__main__":
    try:
        #创建StrictRedis对象,与redis服务器建立连接
        sr=StrictRedis()
        #设置键py1的值,如果键已经存在则进行修改,如果键不存在则进行添加
        result = sr.delete('py1')
        #输出响应结果,如果删除成功则返回受影响的键数,否则则返回0
        print result
    except Exception as e:
        print e

3. 改

修改

  • 方法set,如果键已经存在则进行修改,如果键不存在则进行添加
  • 创建文件redis_set.py,编写代码如下
#coding=utf-8
from redis import *

if __name__=="__main__":
    try:
        #创建StrictRedis对象,与redis服务器建立连接
        sr=StrictRedis()
        #设置键py1的值,如果键已经存在则进行修改,如果键不存在则进行添加
        result = sr.set('py1','hr')
        #输出响应结果,如果操作成功则返回True,否则返回False
        print result
    except Exception as e:
        print e

4. 查

获取

  • 方法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None
  • 创建文件redis_get.py,编写代码如下
#coding=utf-8
from redis import *

if __name__=="__main__":
    try:
        #创建StrictRedis对象,与redis服务器建立连接
        sr=StrictRedis()
        #获取键py1的值
        result = sr.get('py1')
        #输出键的值,如果键不存在则返回None
        print result
    except Exception as e:
        print e

5. 获取键

  • 方法keys,根据正则表达式获取键
  • 创建文件redis_keys.py,编写代码如下
#coding=utf-8
from redis import *

if __name__=="__main__":
    try:
        #创建StrictRedis对象,与redis服务器建立连接
        sr=StrictRedis()
        #获取所有的键
        result=sr.keys()
        #输出响应结果,所有的键构成一个列表,如果没有键则返回空列表
        print result
    except Exception as e:
        print e

参阅:

  • 牛壮壮redis笔记

更新中......


你可能感兴趣的:(数据库 | 初识Redis 1)