redis和mysql的关系型数据库_非关系型数据库redis

Redis 是一款内存数据库,支持数据持久化,提供丰富的数据结构如字符串、列表、集合、有序集合和哈希。常用于登录会话、排行榜、消息队列、在线人数统计等场景。相较于 Memcached,Redis 支持更多数据结构和过期策略。Python 操作 Redis 包括设置、获取、删除键值,列表操作,集合操作,哈希操作,事务处理,发布/订阅等功能。此外,Redis 还支持主从复制和集群搭建。
摘要由CSDN通过智能技术生成

redis教程:

概述

redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。相关参考文档:http://redisdoc.com/index.html

redis使用场景:

登录会话存储:存储在redis中,与memcached相比,数据不会丢失。

排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数等。

作为消息队列:比如celery就是使用redis作为中间人。

当前在线人数:还是之前的秀场例子,会显示当前系统有多少在线人数。

一些常用的数据缓存:比如我们的BBS论坛,板块不会经常变化的,但是每次访问首页都要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。

把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。

好友关系:微博的好友关系使用redis实现。

发布和订阅功能:可以用来做聊天软件。

redis和memcached的比较:

memcached

redis

类型

纯内存数据库

内存磁盘同步数据库

数据类型

在定义value时就要固定数据类型

不需要

虚拟内存

不支持

支持

过期策略

支持

支持

存储数据安全

不支持

可以将数据同步到dump.db中

灾难恢复

不支持

可以将磁盘中的数据恢复到内存中

分布式

支持

主从同步

订阅与发布

不支持

支持

redis日常操作

1.安装:centos7

wget http://download.redis.io/releases/redis-5.0.0.tar.gz

tar -zxvf redis-5.0.0.tar.gz

yum install gcc

yum install gcc-c++

make

cp src/redis-server /usr/bin/

cp src/redis-cli /usr/bin/

2.启动redis数据库服务

启动命令:

redis-server redis.conf

3.停止redis数据库服务

service redis stop

4.连接上redis-server:

redis-cli -p 6379 -h 127.0.0.1

5.添加:

set key value

如:

set username balabala

将字符串值value关联到key。如果key已经持有其他值,set命令就覆写旧值,无视其类型。并且默认的过期时间是永久,即永远不会过期。

6.删除:

del key

如:

del username

7.设置过期时间

expire key timeout(单位为秒)

也可以在设置值的时候,一同指定过期时间:

set key value EX timeout

或:

setex key timeout value

8.查看过期时间

ttl key

如:

ttl username

9.查看当前redis所有的key

keys *

10.列表操作

在列表左边添加元素:

lpush key value

将值value插入到列表key的表头。如果key不存在,一个空列表会被创建并执行lpush操作。当key存在但不是列表类型时,将返回一个错误。

在列表右边添加元素:

rpush key value

将值value插入到列表key的表尾。如果key不存在,一个空列表会被创建并执行RPUSH操作。当key存在但不是列表类型时,返回一个错误。

查看列表中的元素:

lrange key start stop

返回列表key中指定区间内的元素,区间以偏移量start和stop指定,如果要左边的第一个到最后的一个lrange key 0 -1。

移除列表中的元素:

移除并返回列表key的头元素:

lpop key

移除并返回列表的尾元素:

rpop key

指定返回第几个元素:

lindex key index

将返回key这个列表中,索引为index的这个元素。

获取列表中的元素个数:

llen key

如:

llen languages

删除指定的元素:

lrem key count value

如:

lrem languages 0 php

根据参数 count 的值,移除列表中与参数 value 相等的元素。count的值可以是以下几种:

count > 0:从表头开始向表尾搜索,移除与value相等的元素,数量为count。

count < 0:从表尾开始向表头搜索,移除与 value相等的元素,数量为count的绝对值。

count = 0:移除表中所有与value 相等的值。

11.set集合的操作:

添加元素:

sadd set value1 value2....

如:

sadd team xiaotuo datuo

查看元素:

smembeers set

如:

smembers team

移除元素:

srem set member...

如:

srem team xiaotuo datuo

查看集合中的元素个数:

scard set

如:

scard team1

获取多个集合的交集:

sinter set1 set2

如:

sinter team1 team2

获取多个集合的并集:

sunion set1 set2

如:

sunion team1 team2

获取多个集合的差集:

sdiff set1 set2

如:

sdiff team1 team2

12.hash,哈希操作:

添加一个新值:

hset key field value

如:

hset website baidu baidu.com

将哈希表key中的域field的值设为value。

如果key不存在,一个新的哈希表被创建并进行 HSET操作。如果域 field

已经存在于哈希表中,旧值将被覆盖。

获取哈希中的field对应的值:

hget key field

如:

hget website baidu

删除field中的某个field:

hdel key field

如:

hdel website baidu

获取某个哈希中所有的field和value:

hgetall key

如:

hgetall website

获取某个哈希中所有的field:

hkeys key

如:

hkeys website

获取某个哈希中所有的值:

hvals key

如:

hvals website

判断哈希中是否存在某个field:

hexists key field

如:

hexists website baidu

获取哈希中总共的键值对:

hlen field

如:

hlen website

12.事物操作:Redis事务可以一次执行多个命令,事务具有以下特征:

隔离操作:事务中的所有命令都会序列化、按顺序地执行,不会被其他命令打扰。

原子操作:事务中的命令要么全部被执行,要么全部都不执行。

开启一个事务:

multi

以后执行的所有命令,都在这个事务中执行的。

执行事务:exec会将在multi和exec中的操作一并提交。

取消事务:discard会将multi后的所有命令取消。监视一个或者多个key:

watch key...

监视一个(或多个)key,如果在事务执行之前这个(或这些) key被其他命令所改动,那么事务将被打断。

取消所有key的监视:

unwatch

13.发布/订阅操作:

给某个频道发布消息:

publish channel message

订阅某个频道的消息:

subscribe channel

14.持久化

redis提供了两种数据备份方式,一种是RDB,另外一种是AOF,以下将详细介绍这两种备份策略:

d17f437a11cd

image

Python 操作redis

安装python-redis:

pip install redis

2.新建一个文件比如redis_test.py,然后初始化一个redis实例变量,并且

在ubuntu虚拟机中开启redis。比如虚拟机的ip地址为192.168.174.130。

示例代码如下:

# 从redis包中导入Redis类

from redis import Redis

# 初始化redis实例变量

xtredis = Redis(host='192.168.174.130',port=6379)

3.对字符串的操作:操作redis的方法名称,跟之前使用redis-cli一样,现就

一些常用的来做个简单介绍,示例代码如下(承接以上的代码):

# 添加一个值进去,并且设置过期时间为60秒,如果不设置,则永远不会过期

xtredis.set('username','xiaotuo',ex=60)

# 获取一个值

xtredis.get('username')

# 删除一个值

xtredis.delete('username')

4.对列表的操作:同字符串操作,所有方法的名称跟使用redis-cli操作是一样的:

# 给languages这个列表往左边添加一个python

xtredis.lpush('languages','python') # 给languages这个列表往左边添加一个php

xtredis.lpush('languages','php') # 给languages这个列表往左边添加一个javascript

xtredis.lpush('languages','javascript') # 获取languages这个列表中的所有值

print xtredis.lrange('languages',0,-1) > ['javascript','php','python']

5.对集合的操作:

# 给集合team添加一个元素xiaotuo

xtredis.sadd('team','xiaotuo')

# 给集合team添加一个元素datuo

xtredis.sadd('team','datuo')

# 给集合team添加一个元素slice

xtredis.sadd('team','slice')

# 获取集合中的所有元素

xtredis.smembers('team')

> ['datuo','xiaotuo','slice'] # 无序的

6.对哈希(hash)的操作:

# 给website这个哈希中添加baidu

xtredis.hset('website','baidu','baidu.com')

# 给website这个哈希中添加google

xtredis.hset('website','google','google.com')

# 获取website这个哈希中的所有值

print xtredis.hgetall('website')

> {"baidu":"baidu.com","google":"google.com"}

7.事务(管道)操作:redis支持事务操作,也即一些操作只有统一完成,才

能算完成。否则都执行失败,用python操作redis也是非常简单,示例代码如下:

# 定义一个管道实例

pip = xtredis.pipeline()

pip = xtredis.pipeline()

pip.set('username', 'xiaomei')

pip.set('school', 'qinghua')

pip.execute()

8.事务(管道)操作:redis支持事务操作,也即一些操作只有统一完成,才

能算完成。否则都执行失败,用python操作redis也是非常简单,示例代码如下:

#订阅

from redis import Redis

ps = xtredis.pubsub()

ps.subscribe('email')

while True:

for item in ps.listen():

if item['type'] == 'message':

data = item.get('data')

print(data.decode('utf-8'))

#发布

from redis import Redis

xtredis = Redis(host='192.168.254.41', port=6379)

xtredis.publish('email', 'xxx@qq.com')

以上便展示了python-redis的一些常用方法,如果想深入了解其他的方

法,可以参考python-redis的源代码(查看源代码pycharm快捷键提示:把

鼠标光标放在import Redis的Redis上,然后按ctrl+b即可进入)。

redis搭建主从

1.拷贝一份redis配置文件为slave-6380.conf

cp redis.conf slave.conf

2.编辑slave-6380.conf文件

vim slave-6380.conf

bind 192.168.254.41

slaveof 192.168.254.41 6379

port 6380

redis集群

redis集群

redis集群我这里部在2个机器上

第一台:192.168.254.41

第二台:192.168.254.45

每一台机器创建3个redis配置文件

第一台机器配置:

mkdir conf

touch 7000.conf 7001.conf 7002.conf

vim 7000.conf#编辑文件并且把如下内容拷贝进去

(剩下的7001.conf和7002.conf也是如此,把一下7000改成7001和7002即可)

port 7000 #绑定端口

bind 192.168.254.41 #绑定对外连接提供的ip

daemonize yes #开启守护进程

pidfile 7000.pid #进程文件名

cluster-enabled yes #是否是集群

cluster-config-file 7000_node.conf #集群配置文件

cluster-node-timeout 15000 #集群连接超时时间

appendonly yes #数据持久化类型

第二台机器配置

mkdir conf

touch 7003.conf 7004.conf 7005.conf

vim 7000.conf#编辑文件并且把如下内容拷贝进去

(剩下的7004.conf和7005.conf也是如此,把一下7000改成7004和7005即可)

port 7000 #绑定端口

bind 192.168.254.45 #绑定对外连接提供的ip

daemonize yes #开启守护进程

pidfile 7000.pid #进程文件名

cluster-enabled yes #是否是集群

cluster-config-file 7000_node.conf #集群配置文件

cluster-node-timeout 15000 #集群连接超时时间

appendonly yes #数据持久化类型

在两台机器上分别执行这3个配置文件

#192.168.254.41

redis-server 7000.conf

redis-server 7001.conf

redis-server 7002.conf

#192.168.254.45

redis-server 7003.conf

redis-server 7004.conf

redis-server 7005.conf

redis需要的Ruby版本最低是2.2.2,但是CentOS7 yum库中ruby的版本支

持到 2.0.0,可gem 安装redis需要最低是2.2.2,采用rvm来更新ruby:

安装RVM

1.curl -L get.rvm.io | bash -s stable

2.find / -name rvm -print(此时可能出现问题)

3.如果报错执行(4,5步)

4.curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -

5.curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -

6.出现如下内容代表成功

/usr/local/rvm

/usr/local/rvm/src/rvm

/usr/local/rvm/src/rvm/bin/rvm

/usr/local/rvm/src/rvm/lib/rvm

/usr/local/rvm/src/rvm/scripts/rvm

/usr/local/rvm/bin/rvm

/usr/local/rvm/lib/rvm

/usr/local/rvm/scripts/rvm

7.使刚安装的rvm立即生效

source /usr/local/rvm/scripts/rvm8.安装一个ruby版本

rvm install 2.4.1

9.使用一个ruby版本

rvm use 2.4.1

10.设置默认ruby版本

rvm use 2.4.1 --default

11.gem install redis

12.redis-cli --cluster create 192.168.93.10:7001 192.168.93.11:7002 192.168.93.13:7003 --cluster-replicas 1

13.连接命令:

redis-cli -c -h 192.168.93.11 -p 7001

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值