Redis数据库

概述

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

redis使用场景

  1. 登录会话存储:存储在redis中,与memcached相比,数据不会丢失。
  2. 排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数等。
  3. 作为消息队列:比如celery就是使用redis作为中间人。
  4. 当前在线人数:还是之前的秀场例子,会显示当前系统有多少在线人数。
  5. 一些常用的数据缓存:比如我们的BBS论坛,板块不会经常变化的,但是每次访问首页都要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。
  6. 把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。
  7. 好友关系:微博的好友关系使用redis实现。
  8. 发布和订阅功能:可以用来做聊天软件。

redis和memcached的比较:

memcachedredis
类型纯内存数据库内存磁盘同步数据库
数据类型在定义value时就要定义数据类型不需要
虚拟内存不支持支持
过期策略支持支持
存储数据安全不支持将数据同步到数据库数据库中
灾难恢复不支持可以将磁盘中的恢复到内存中
分布式支持主从同步
订阅和发布不支持支持

dedis在ubuntu系统中的安装与启动

  1. 安装:
sudo apt-get install redis-server
  1. 卸载:
sudo apt-get purge --auto-remove dedis-server
  1. 启动:redis安装之后,默认会自动启动,可以通过以下命令查看:
ps aux|grep redis

如果想手动启动,通过以下命令进行启动:

sudo service redis-server start
  1. 停止:
sudo service redis-server stop

对redis的操作

对redis的操作可以用两种方式,第一种方式采用redis-cli,第二种方式采用编程语言,比如Python、PHP和JAVA等。

使用redis-cli对redis进行字符窜操作:
  1. 启动reids:
sudo service reids-server start
  1. 连接上redis-server:
redis-cli -h [ip] -p [端口]
  1. 添加

语法:

set key value

示例:

set username xujin

如果我们输入的字符窜有空格,我们就需要加一个双引号,否者会报语法错误:

set username "hello world"

如果key已经拥有其他的值,set命令就覆盖旧值,无视其类型,并且默认的过期时间时永久,即永远不会过期。
4. 获取值:

语法:

get key

示例:

get username
  1. 删除:

语法:

del key

示例:

del username
  1. 设置过期时间:
expire key timeout(单位为秒)

示例:

expire username 60

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

set key value EX timeout
或:
setex key timeout value

示例:

set username xujin EX 60
或:
setex username 60 xujin
  1. 查看过期时间:
ttl key

出现的数字是还剩下的时间的秒数
示例:

ttl username
  1. 查看当前redis中所有的key:
keys *
9. 列表操作:
  1. 在列表左边添加元素:
lpush key value

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

lpush website www.baidu.com

这样,我们就将www.baidu.com这一条数据添加到website这个列表中去了。
2. 在列表右边添加元素:

rpush key value
  1. 查看列表中的元素:
lrange key start stop

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

lrange website 0 -1
  1. 移除列表中的元素:
    1. 移除并返回列表key的头元素:lpop key
    2. 移除并返回列表key的尾元素:rpop key
    3. 移除并返回列表key的中间元素:lrem key count value,将删除这个列表中,count个值为value的元素
  2. 指定返回第几个元素:
lindex key index

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

lindex website 0
  1. 获取列表中元素的个数:
llen key
例如:
llen website
  1. 删除指定的元素:
lrem key count value

示例:

删除website这个表中两个www.baidu.com的字符窜

lrem website 2 www.baidu.com

删除website这个表中所有的www.baidu.com的字符窜

lrem website 0 www.baidu.com

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

  • count > 0:从表头开始向表尾搜索,移除与value相等的元素,数量为count。
  • count < 0:从表尾开始向表头搜索,移除与 value相等的元素,数量为count的绝对值。
  • count = 0:移除表中所有与value 相等的值。
10.set 集合的操作:

集合和列表不一样的地方:集合也是一个列表,只是集合不能拥有相同的两条数据。集合中的元素是无序的。添加进去的数据位置也就是随机的了。

  1. 添加元素:
sadd key value1 value2 ......

示例:

sadd school1 qinghua beida

这样,我们就添加了两条数据到school1这个集合里面了,可以看到,集合可以一次性添加多个数据的。而列表则不能。
2. 查看元素:

smembeers key

示例:

  smembers school1
  1. 移除元素:
srem key value ...

示例:

srem school1 beida qinghua

可以一次性移除多个。
4. 查看集合中的元素的个数:

scard key

示例:

scard school1
  1. 获取多个集合的交集:
sinter key1 key2

示例:

sinter school1 school2
  1. 获取多个集合的并集:
sunion key1 key2

示例:

sunion school1 school2
  1. 获取多个集合的差集:
sdiff key1 key2

示例:

sdiff school1 school2

返回的结果是key1-key2的结果。

11. redis的哈希操作:

什么是哈希:就在一个key对应的value是一个字典类型的数据。

  1. 添加一个新值:
hset key field value

示例:
在persion这个哈希表中,添加一个name字段,值为xujin

hset persion name xujin

一次性添加多个字段:

hmset persion name xujin age 18 height 100

如果persion存在,直接添加数据,如果不存在,就创建这个哈希表,然后添加数据。如果这个哈希表中的字段已经存在,就覆盖掉旧值,如果不存在,就创建一个新的字段并添加值。
2. 获取哈希中的field对应的值:

hget key field

示例:
获取persion中的name字段

hget persion name
  1. 删除哈希中的某个字段:
hdel key field

示例:
删除persion中name字段

hedl persion name
  1. 获取某个哈希中所有的field和value
hgetall key

示例:

hgetall persion
  1. 获取某个哈希中所有的fiels
hkeys key

示例:

hkeys persion
  1. 获取某个哈希中所有的值:
hvals key

示例:

hvals persion
  1. 判断哈希中是否存在某个field
hexists key field

示例:

hexists persion name

有就返回1,否则返回0。
8. 获取哈希中总共的键值对:

hlen key

示例:

hlen persion

就会返回这个哈希中键值对的数目。

12. 事务操作:Redis事务可以一次执行多个命令,事务具有以下特征:
  • 隔离操作:事务中的所有命令都会序列化、按顺序地执行,不会被其他命令打扰。
  • 原子操作:事务中的命令要么全部被执行,要么全部都不执行。
  1. 开启一个事务:
multi

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

  1. 执行事务:
exec

会将在multi和exec中的操作一并提交
3. 取消事务:

discard

会将multi后所有的命令取消掉。
4. 监视一个或多个key:

watch key1 key2 ......

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

  1. 取消所有的key监视:
unwatch

示例,开启一个事务并执行操作:
在这里插入图片描述
如果一个事务执行到一半不想执行了,那么就执行discard命令退出事务。

示例:
使用watch监听username,如果username这个值在一个事务中执行命令的时候,被另外一个命令改变了username的值,那么这个事务将会被打断,不会执行这个事务:

watch username

这样,就监听了username这个值了。

13. 发布和订阅操作:
  1. 给某个频道发布消息:(相当于打电话)
publish channel(频道) message(消息)
  1. 订阅某个频道的消息:(相当于接电话)一次可以订阅多个频道
subscribe channel(频道)...

示例:
要看到这个效果,我们需要打开两个终端,然后在一个终端中订阅一个频道:

subscribe chatroom

然后在另外一个终端中发布消息:

publish chatroom "hello world"

这样,我们就能在另外一个终端接收到这条信息。

在这里插入图片描述

补充一个比较暴力的命令:

删除redis里面的所有键值对

flushall
14. 持久化:redis提供了两种数据备份方式,一种是RDB,另外一种是AOF,下面是两种方式的区别:
RDBAOF
开启关闭开启:默认开启。关闭:把配置文件中所有的save都注释,就是关闭了。开启:在配置文件中设置appendonly为 yes即开启了aof,为no关闭。
同步机制可以指定某个时间内发生多少个命令进行同步。比如1分钟内发生了2次命令,就做一次同步。每秒同步或者每次发生命令后同步
存储内容存储的是redis里面的具体的值存储的是执行的更新数据的操作命令
存储文件的路径根据dir以及dbfilename来指定路径和具体的文件名根据dir以及appendfilename来指定具体的路径和文件名
优点(1)存储数据到文件中会进行压缩,文件体积比aof小。(2)因为存储的是redis具体的值,并且会经过压缩,因此在恢复的时候速度比AOF快。(3)非常适用于备份。(1)AOF的策略是每秒钟或者每次发生写操作的时候都会同步,因此即使服务器故障,最多只会丢失1秒的数据。 (2)AOF存储的是Redis命令,并且是直接追加到aof文件后面,因此每次备份的时候只要添加新的数据进去就可以了。(3)如果AOF文件比较大了,那么Redis会进行重写,只保留最小的命令集合。
缺点(1)RDB在多少时间内发生了多少写操作的时候就会出发同步机制,因为采用压缩机制,RDB在同步的时候都重新保存整个Redis中的数据,因此你一般会设置在最少5分钟才保存一次数据。在这种情况下,一旦服务器故障,会造成5分钟的数据丢失。(2)在数据保存进RDB的时候,Redis会fork出一个子进程用来同步,在数据量比较大的时候,可能会非常耗时。(1)AOF文件因为没有压缩,因此体积比RDB大。 (2)AOF是在每秒或者每次写操作都进行备份,因此如果并发量比较大,效率可能有点慢。(3)AOF文件因为存储的是命令,因此在灾难恢复的时候Redis会重新运行AOF中的命令,速度不及RDB。
更多http://redisdoc.com/topic/persistence.html#redis
配置文件为:/etc/redis/下的redis.conf

然后我们使用管理员权限打开redis.conf,找到下面3句代码,就是我们RDB的存储方式(同步机制)。

save 900 1  # 900秒之内发生了一次更新redis的操作,就将redis中的数据同步到RDB文件中
save 300 10 # 300秒之内发生了10次更新redis的操作,就会将reids中的数据同步到RDB文件中
save 60 10000 # 60秒之内发生了10000次更新redis的操作,也会将redis中的数据同步到RDB文件中

RDB文件的路径是由dir和filename这两个变量的值来控制的,所以我们想要找到RDB文件的位置,首先应该在这个文件中找到这个两个变量。
在这里插入图片描述
所以RDB文件的位置在/var/lib/redis/下,名字为dump.rdb
如果我们需要关闭RDB这种备份方式,我们只需要将上面的3个save注释掉就行了。

开启AOF,我们只需要在配置文件中找到appendonly这个变量,并且将值设置为yes就开启了。
在这里插入图片描述

注意: 修改了配置文件的内容就需要重启reids才能生效:

service redis-server restart

这种方式存储是根据dir以及appendfilename者两个变量来指定具体的路径和文件名

然后我们进入/var/lib/redis/文件下,使用ls命令就能够看到生成了一个.aof文件。

配置aof的同步机制

# appendfsync always    # 每次执行更新redis的操作时同步一次
appendfsync everysec    # 每秒同步一次
# appendfsync no  # 关闭redis的同步机制,使用操作系统自己的同步机制,相当于每30秒同步一次,这种方式用的比较少,一般很少用

上面中同步机制我们需要使用那一种就直接取消注释那一种,然后注释掉另外一种就行了。

RDB和AOF的存储内容:
执行命令

set username xujin

RDB中的内容为:

username->xujin

RDB存储文件会进行压缩
AOF中的内容为:

set username xujin

注意: redis.conf文件中不能出现中文,否则会出现一些错误。

15. 安全:在配置文件中,设置requirepass password,那么客户端连接的时候,需要使用密码:

默认是被注释了的,我们需要取消注释,并在后面设置我们的密码:
在这里插入图片描述
修改配置文件后,我们需要重启redis服务。

service redis-server restart

然后我们连接redis数据库,这一步并不会报错,,但是当我们使用redis命令时,就会报错了。
在这里插入图片描述
这是因为我们在配置文件中设置了密码,所以我们这个时候就需要使用密码了

auth 111111(刚才配置文件中设置的密码)

之后,我们就能正确的操作我们的redis的数据库了。

当然,在连接redis数据库时我们也可以指定密码,后面就不需要使用auth命令了

redis-cli -p 6379 -h 127.0.0.1 -a 111111

这样,我们也可以正常的操作我们的数据库了。

16. 其他机器连接本机redis

打开配置文件,找到bind这个变量。后面只有一个127.0.0.1这个值,所以别的电脑是不能够连接到我们的redis数据库的。我们需要将我们自己电脑的ip地址加上去,别的电脑才能够连接到我们的redis,注意:是加我们自己的ip地址,不是添加 需要连接我们redis的机器的ip地址。添加别人的ip地址重启redis服务的时候就会报错了。
在这里插入图片描述

然后我们重启redis,别的机器就能够连接到我们的redis了。

sudo service redis-server restart
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值