1、常用命令
keys * 返回满足的所有键 ,可以模糊匹配 用法:keys pattern exists :是否存在指定的key,存在返回1,不存在返回0 用法:exists key [key ...] exprie:设置某个key的过期时间 用法:exprie key seconds ttl:查看剩余时间 用法:ttl key persisit:取消过期时间 用法:persisit key select : 选择数据库 数据库为0-15(一共16个数据库)默认进入的是0数据库(设计成多个数据库实际上是为了数据库安全和备份) 用法:select index move key: 将当前数据中的key转移到其他数据库 用法:move key db randmokey:随机返回一个key 用法:randomkey - rename:重命名key 用法: rename key newkey echo:打印命令 用法:echo message dbsize:查看数据库的key数量 用法:dbsize - info:查看数据库信息 用法:info [section] config get * 实时传储收到的请求,返回相关的配置 用法:config get* flushdb :清空当前数据库 用法:flushdb - flushall :清空所有数据库 用法:flushall -
2、Reids事务
2.1、 事务
2.1.1 事务是什么?
事务表示的是一组动作,这组动作要么全部执行,要么全部不执行。
2.1.2 为什么会有这样的需求呢?看看下面的场景:
微博是一个弱关系型社交网络,用户之间有关注和被关注两种关系,比如两个用户A和B,如果A关注B,则B的粉丝中就应该有A。关注这个动作需要两个步骤完成:在A的关注者中添加B;在B的粉丝中添加A。 这两个动作要么都执行成功,要么都不执行。否则就可能会出现A关注了B,但是B的粉丝中没有A的不可容忍的情况。
2.2、 Redis事务
Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。Redis事务的实现需要用到 multi 和 exec两个命令,事务开始的时候先向Redis服务器发送 multi 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 exec命令表示事务命令结束。
例:
从输出中可以看到,当输入multi命令后,服务器返回OK表示事务开始成功,然后依次输入需要在本次事务中执行的所有命令,每次输入一个命令服务器并不会马上执行,而是返回”QUEUED”,这表示命令已经被服务器接收并且暂时保存起来,最后输入exec命令后,本次事务中的所有命令才会被依次执行,可以看到最后服务器一次性返回了三个OK,这里返回的结果与发送的命令是按顺序一一对应的,这说明这次事务中的命令全都执行成功了。
2.3、Redis事务错误处理
1、Redis2.6.5之前的版本会忽略错误的命令,执行其他正确的命令,2.6.5之后的版本会忽略这个事务中的所有命令,都不执行。
2、如果客户端在发送EXEC命令之前断线了,则服务器会清空事务队列,事务中的所有命令都不会被执行。而一旦客户端发送了EXEC命令之后,事务中的所有命令都会被执行,即使此后客户端断线也没关系,因为服务器已经保存了事务中的所有命令。
2.4、watch命令
我们已经知道在一个事务中只有当所有命令都依次执行完后才能得到每个结果的返回值,可是有些情况下需要先获得一条命令的返回值,然后再根据这个值执行下一条命令。例如,INCR命令可以使用GET和SET命令自己实现,但会出现竞态条件,伪代码如下:
def incr( key) value=GET key if not value value=0 value= value+1 SET key, value return value
我们可以用事务来实现incr函数以防止竞态条件,可是因为事务中的每个命令的执行结果都是最后一起返回的,所以无法将前一条命令的结果作为下一条命令的参数,即在执行SET命令时无法获得GET命令的返回值,也就无法做到增1的功能了。
要解决这个问题,我们可以换一种思路。即在GET获得键值后保证该键值不被其他客户端修改,直到函数执行完成后才允许其他客户端修改该键键值,这样也可以防止竞态条件。要实现这一思路需要请出事务家族的另一位成员: watch。 watch命令可以监控一个或多个键,一旦被监控的键中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到exec命令(事务中的命令是在exec之后才执行的,所以在multi命令后可以修改watch监控的键值)
可以使用watch做到在执行事务前保持在事务中要用到的数据不被其他客户端修改。
使用watch实现incr函数的伪代码
def incr( key) watch key value=get key if not value value=0 value= value+1 multi set key, value result=exec return result[0]因为EXEC命令返回值是多行字符串类型,所以代码中使用result[0]来获得其中第一个结果。
2.5、Redis事务的特点
1、 一个 事务中的命令要么都执行,要么都不执行2、保证一个事务中的命令依次执行而不会被其他命令插入
3、Redis中的事务并没有关系型数据库中的事务回滚(rollback)功能
3、Reids发布与订阅消息
subscribe[频道] 进行订阅监听 用法:subscribe channel [channel ...]
publish [频道 发布内容] 进行发布消息广播用法:publish channel message
例
客户端1、客户端2:订阅频道cctv
客户端3:往频道cctv发布消息
4、Reids安全性
因为redis速度相当快,所以一台比较好的服务器下,一个外部用户在一秒内可以进行15W次密码尝试,这意味着你需要设定非常强大的密码来防止暴力破解。(redis一般都设置为内网访问)
可以通过以下方式设置密码
用vi编辑redis.conf文件找到 #reqirepassfoobared 进行修改 reqirepass 你要设置的密码