1、Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在Linux终端使用。
(1)键值相关命令
(2)服务器相关命令
2、键值相关命令
2.1、keys:返回满足给定pattern的所有key
eg:redis 127.0.0.1:6379>keys*
1)”myset01”
2)”myset02”
3)”03myset03”
redis 127.0.0.1:6379>keys my*
1)”myset01”
2)”myset02”
2.2、exists:确认一个key是否存在
eg:redis 127.0.0.1:6379>existsname
(integer)0
redis 127.0.0.1:6379>exists age
(integer)1
2.3、del:删除一个key
eg:redis 127.0.0.1:6379>del age
(integer)1
2.4、expire:设置一个key的过期时间。
eg:redis 127.0.0.1:6379>expire addr 10
redis 127.0.0.1:6379>ttl addr
(integer)3
redis 127.0.0.1:6379>ttl addr
(integer)-1
注意:在此例子当中,我们设置addr这个key的过期时间为10秒,然后我们不断用ttl来获取这个key的有效时长,直至为-1说明此值已经过期。
2.5、select :选择数据库
eg:redis 127.0.0.1:6379>select0 //选择当前数据库
redis 127.0.0.1:6379>set age 30
redis 127.0.0.1:6379>get age
“30”
redis 127.0.0.1:6379>move age 1 //将0数据库名字为age的key移动到1数据库。
redis 127.0.0.1:6379>get age //因为当前还在0数据库,故age这个key已经不存在了。
nil
redis 127.0.0.1:6379>select 1
redis 127.0.0.1:6379>get age
“30”
2.6、move:将当前数据库中的key转移到其他数据库中。
2.7、persist:移除给定key的过期时间
eg:redis 127.0.0.1:6379>expireage 300
(integer)1
redis 127.0.0.1:6379>ttl age
(integer) 230
redis 127.0.0.1:6379>persist age
(integer)-1 //这里的-1表示取消过期时间。
2.8、randomkey:随机返回key空间的一个key。
eg:redis 127.0.0.1:6379>randomkey
“age”
2.9、rename:重命名key
eg:redis 127.0.0.1:6379>rename age age_new
2.10、type: 返回值的类型。
eg:redis 127.0.0.1:6379>type addr
string
redis 127.0.0.1:6379> type myset
set
3、服务器相关命令
3.1、ping:测试连接是否存活
eg:redis 127.0.0.1:6379>ping
PONG // 表示连接正常
若在ping之前,停掉redis,则连接失败
3.2、echo:在命令行打印一些内容
eg:redis 127.0.0.1:6379>echo lijie
“lijie”
3.3、select:选择数据库。Redis数据库编号为从0~15,我们可以选择任意一个数据库来进行数据的存取。
eg: redis 127.0.0.1:6379>select 1
OK
redis 127.0.0.1:6379>select 16
(error)ERR invalid DB index
3.4、quit:退出连接。功能同exit。
eg:redis 127.0.0.1:6379>quit
redis 127.0.0.1:6379>exit
3.5、dbsize:返回当前数据库中key的数目。
eg:redis 127.0.0.1:6379>dbsize
(integer)18 //说明此库中有18个key。
3.6、info:获取服务器的信息和统计
eg:redis 127.0.0.1:6379>info
redis_version:2.2.12
redis_git_sha1:00000000
redis_git_dirty:0
…..
3.7、config get:实时传储收到的请求。
eg:redis 127.0.0.1:6379>config get dir
1)”dir”
2)”/root/4setup/redis-2.2.12”
说明:本例子中,我们获取了dir这个参数的配置的值,如果想获取全部参数的配置值也很简单,只需要执行”config get *”即可将全部的值都显示出来。
3.8、flushdb :删除当前选择数据库中的所有key。
eg:redis 127.0.0.1:6379>dbsize
(integer)18
redis 127.0.0.1:6379>flushdb
OK
redis 127.0.0.1:6379>dbsize
(integer)0
3.9、flushall:删除所有数据库中的所有key
eg:redis 127.0.0.1:6379>dbsize
(integer)18
redis 127.0.0.1:6379>flushall
redis 127.0.0.1:6379>dbsize
(integer)0
redis 127.0.0.1:6379>select 1
redis 127.0.0.1:6379>dbsize
(integer)0
说明:在0数据库下执行flushall,1数据库也被清空。即为在任意一个数据库下执行flushall,其他数据库的key都会被清空。
4、Redis的高级应用
4.1、安全性
4.1.1、设置客户端连接后进行任何其他指令前需要使用的密码。
4.1.2、警告:因为Redis速度相当快,所以在一台好的服务器下,一个外部用户可以在1秒内进行150K次的密码尝试,这意味着你需要设置非常非常强大的密码来防止暴力破解。
4.1.3、设置方法:在配置文件中修改以下信息即可。
#requiredpass foobared //原内容
requiredpass beijing //修改后的内容
然后在启动时,指定配置文件即可。
4.1.4、登陆数据库的两种授权方式:
(1)进入数据库后用auth授权
eg: redis 127.0.0.1:6379>auth beijing
(2)直接登陆授权
eg:redis 127.0.0.1:6379>/usr/…/redis-cli -a beijing
4.2、主从复制
4.2.1、Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master slave相同的数据库副本。
4.2.2、Redis主从复制的特点:
(1)Master可以拥有多个slave。
(2)多个slave可以连接到同一个master外,还可以连接到其他slave。这样master宕机后,这个slave可以迅速提升为新的master。
(3)主从复制不会阻塞master,在同步数据时,master可以继续处理client请求。
(4)提高系统的伸缩性。
4.2.3、主从复制的过程:
(1)Slave和master建立连接,发送sync同步命令。
(2)Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
(3)后台保存完成后,就将此文件发送给slave。
(4)Slave将此文件保存到硬盘上。
4.2.4、配置主从服务器
配置slave服务器很简单,只需要在slave的配置文件中加入以下2项配置即可:
slaveof 192.168.1.1 6379 #指定master的IP和端口
masterauth beijing #这是主机的密码。
4.2.5、如何判定哪个是mater哪个是slave?
redis 127.0.0.1:6379>info即可。有一个role字段,会显示是master还是slave。
4.3、事务处理
4.3.1、Redis对事务的支持目前比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其它client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连续后续的命令不会立即执行,而是先放入到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。
eg1:redis 127.0.0.1:6379>getage
“33”
redis 127.0.0.1:6379>multi
OK
redis 127.0.0.1:6379>set age 10
redis 127.0.0.1:6379>set age 20
redis 127.0.0.1:6379>exec
1) OK
2) OK
redis 127.0.0.1:6379>get age
“20”
eg2:取消一个事务:discard命令—清空事务的命令队列并退出事务上下文,也就是我们常说的事务回滚。
redis 127.0.0.1:6379>get age
“20”
redis 127.0.0.1:6379>multi
redis 127.0.0.1:6379>set age 30
redis 127.0.0.1:6379>set age 40
redis 127.0.0.1:6379>discard
redis 127.0.0.1:6379>get age
“20”
eg3: 事务执行失败,不能回滚,即为事务中被修改的数据不能恢复原值。
redis 127.0.0.1:6379>mult
redis 127.0.0.1:6379>incr age
redis 127.0.0.1:6379>incr name
redis 127.0.0.1:6379>exec
1)(integer)101
2)(error)ERR value is not an integer or out of range
redis 127.0.0.1:6379>get age
“101”
4.3.2、乐观锁复杂事务控制
大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个“version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1.此时,将提交数据的版本号与数据库表对应的当前版本号进行比对,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。
4.3.4、Redis乐观锁实例:假设有一个age的key,我们开2个session来对age进行赋值操作,我们看一下结果如何?
(1)第一步session1
redis 127.0.0.1:6379>get age
“10”
redis 127.0.0.1:6379>watch age
OK
redis 127.0.0.1:6379>multi
OK
(2)第二步 session2
redis 127.0.0.1:6379>set age 30
OK
redis 127.0.0.1:6379>get age
“30”
(3)第三步session1
redis 127.0.0.1:6379>set age20
QUEUED
redis 127.0.0.1:6379>exec
(nil)
redis 127.0.0.1:6379>get age
“30”
综述:watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然了exec,discard,unwatch命令都会清除链接中的所有监视。
4.4、持久化机制
4.4.1、简述:Redis是一个支持持久化的内存数据库,也就说redis需要经常将内存中的数据同步到硬盘来保证持久化。
4.4.2、Redis支持两种持久化方式:
(1)snapshotting(快照)也是默认方式。
a实质:将数据做一个备份,存到一个文件里面。
b快照是默认的持久化方式。这种方式是将内存中的数据以快照的方式写到默认文件名为dump.rdb的文件中。可以通过配置二进制文件中设置自动做快照的方式。我们可以配置redis在n秒内如果超过m个key修改就自动做快照。
c配置文件:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存。
(2)Append-only file(缩写为aof)的方式。
a实质:将操作存到一个文件里面。
b由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉,就会丢失最后一次快照后的所有修改。
aof比快照有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时,会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当然,由于OS会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。所以可能aof方式的持久化也还是有可能丢失部分修改。
可以通过配置文件告诉redis我们想要通过fsync函数强制OS写入到磁盘的时机。
c配置文件
appendonly yes //启用aof持久化方式
#appendfsync always //收到写命令就立即写入到磁盘,最慢,但是保证完全的持久化
appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no //完全依赖OS,性能最好,持久化没保证。
4.5、发布订阅消息
4.5.1、简介:发布订阅(pub/sub)是一种消息通信模式,主要目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息。
4.5.2例子
(1)进入第一个client1
redis 127.0.0.1:6379>subscribe tv1
Reading messages…
1)”substribe”
2)”tv1”
3)(integer)1
(2)进入第二个client2
redis 127.0.0.1:6379>subscribe tv1 tv2
Reading messages…
1)”substribe”
2)”tv1”
3)(integer)1
1)”substribe”
2)”tv2”
3)(integer)1
(3)进入第三个client3
redis 127.0.0.1:6379>publish tv1 lijielamp
(integer)2 //表示有2个客户端在监听tv1
查看:此时client2和client1会自动弹出消息
1)”message”
2)”tv2”
3)”lijielamp”
4.6、虚拟内存的使用
4.6.1、简介:Redis的虚拟内存与OS中的虚拟内存不是一回事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外。另外能够提高数据库容量的办法就是使用虚拟内存将那些不经常访问的数据交换到磁盘上。
4.6.2、vm相关配置:
vm-enabled yes #开启vm功能
vm-swap-file #交换出来的value保存的文件路径
vm-max-memory #redis使用的最大内存上限
vm-page-size 32 #每个页面的大小32字节
vm-pages 134217728 #最多使用多少页面
vm-max-threads 4 #用于执行value对象换入缓存的工作线程数目。