Redis学习笔记
2015-10-19 12:02
387 查看
基本介绍
使用键值对(key-value)形式存储数据
数据类型:String,List,Set,Zset
为了保证效率,数据都是缓存在内存中,也可以周期性的把更新的数据写入磁盘或者把修改操作写入到追加的记录文件
适用场合(新浪微博):
应用程序直接访问Redis数据库
应用程序直接访问Redis,只有当Redis访问失败时候才访问MYSQL
启动Redis
服务器端:redis-server命令,要指定配置文件,默认redis.conf
客户端:redis-cli
默认端口6379
后台启动:修改配置文件中的daemonize选项
停止:Pkill redis-server
String
类型:String类型是二进制安全的
语法:
set 设置键值 set key value
例如 set name zhangsan
get 获得键值 get key
例如 get name
Setnx 设置键值(已经存在不覆盖) setnx name value
Setex 设置键值(有效期)setex key
时间 value(单位:秒)
例如 set haircolor 10 red
Setrange
替换键值的一部分 setrange key
替换开始的下标
替换成的字符串
mset 设置多个键值
都成功或者都失败 mset key1 value1 key2 value2
Msetnx 设置多个键值
都成功或者都失败 ,不覆盖已经存在的值
例如:msetnx key1 val1 key2 val2
getset 获取旧的值,设置新的值,getset key
新值
Getrang 获得键值的子串儿 getrang key
开始下标
结束下标
mget 一次获得多个值 mget key1 key2 key3..
incr 自增1 incr key
incrby 加上指定数目,可以是负数 incrby key
数字
decr 自减1 decr key
Decrby 减去指定
是负数数目, decrby key
数字
Append 给键值追加内容 append key
要追加的字符串
Strlen 查看键值的长度 strlen key
Hash类型便于存储对象
hset 设置哈希表的一个键值
语法:hset哈希表名字
field1 val1
hget获取哈希表的一个键值
语法 hget哈希表名字
fieldname
hsetnx 类似hset,不同的是有值的话不覆盖
语法:hsetnx哈希表名字
field1 val1
hmset 批量设置多个键值
语法:hmset 哈希表名字
field1 val1 field2 val2
hmget获取多个键值
hmget哈希表名字 field1 field2…
hincrby哈希表中某个键值加指定数字
语法:hincrby哈希表名字
field1 要加的数字
hexists判断哈希表中某字段是否存在,存在返回1,否则返回0
语法:hexists哈希表名字 filed1
hlen 返回哈希表中键的个数
语法:hlen 哈希表名字
hdel删除指定的field
语法: hdel哈希表名字 要删除的field
hkeys返回哈希表中所有fields的名字
语法:hkeys哈希表名字
hvals 返回哈希表中所有value
语法:hvals哈希表的名字
hgetall 获取哈希表中全部的field和value
语法:hgetall哈希表名字
list类型 链表结构 可以从头部或者尾部添加删除元素,可以作为栈,也可以作为队列
lpush从头部压入一个字符串元素
语法:lpush链表名 值
lrange 链表名
0 -1
表示从头部的第一个元素取到尾部的第一个元素,也就是从头部取所有元素
rpush从尾部压入一个字符串元素
语法 rpush链表名 值
linsert 在元素前插入一个元素,头的方向为前
语法:linsert链表名
before 已有元素 要插入的元素
lset设置list中指定下标的元素值
语法:lset listname 下标 要设置的值
lrem从List中删除n个和value相同的元素(n<0从尾部删除,n=0全部删除)
语法:lrem listnamen value
Set类型:是string类型的无序集合,集合中不允许重复元素,对集合可以进行并集,交集,差集等操作
Sadd 向集合中添加元素
语法:sadd集合名 要添加的元素
例子:sadd myset1one向myset1中添加one
Smembers 查看集合中元素
语法:smembers 集合名
Srem 删除名称为key的set中的元素
语法:srem集合名 要删除的元素
例子:srem myset1one 从myset1中删除one
Spop随机返回并且删除名称为key的set中的一个元素
语法:spop集合名
例子:spop myset1从myset1中随机弹出一个元素,并且删除它
Sdiff 返回两个集合的差集,以第一个集合为标准
语法:sdiff集合1 集合2
例子:sdiff myset1 myset2返回myset1中与myset2不同的元素
Sdiffstroe 将两个集合的差集存储到另外一个集合
语法:sdiffstore集合3集合2 集合1 将集合1和集合2的差集存储在集合3中
Sinter返回所有给定集合的交集
语法:sinter myset1 myset2
Sinterstroe将取的差集存储在另外一个集合
语法:sinterstore集合3集合2集合1 将集合1和集合2的交集存储在集合3中
Sunion取所有给定集合的并集
语法:sunion集合1集合2
Sunionstore取所有给定集合的并集并且存储
语法:同sdiffstore和sinterstore
Smove 从第一个key对应的set中移除member并添加到第二个set中
语法:smove 集合1集合2 元素1 把元素1从集合1中移动到集合2中
Scard 返回名称为key的set的元素个数
语法:scard集合名
Sismember判断某元素是否为集合的元素,是的话返回1,否则返回0
语法:sismember集合名元素1 判断元素1是否是集合中元素
Srandmember随机返回名称为key的set的一个元素,但不删除元素
语法:srandmember集合名
zset类型:在set的基础上增加了一个顺序属性,这一属性在添加修改元素时候可以指定,每次指定后,zset会自动重新按照新的值调整顺序。可以理解为两列的Mysql表,一列存value,一列存顺序。
Zadd向名称为key的zset中添加元素member,score用于排序。如果该元素存在则更新其顺序
语法:zadd 集合名 顺序 元素
例子:zadd sset11 one 向集合sset1中添加元素one,顺序号为1
Zrang myzset 0 -1 withscores 取myzset中的所有元素,包含顺序号
Zrem删除名称为key的zset中的元素member
语法:zrem集合名 要删除的元素
Zincrby如果在名称为key的zset中已经存在元素member,则该元素的score增加increment,否则向该集合中添加该元素,其score的值为increment
语法:zincrby集合名 increment 元素
Zrank返回名称为key的zset中的member元素的排名(按score从小到大排序)即索引下标
语法:zrank集合名 元素
例子:zrank myzset3 two 返回myzset3中元素two的索引下标(下标从0开始)
Zrevrank 返回名称为key的zset中的member元素的排名(按score从大到小排序)即下标,先按照score降序排序,然后再找索引
Zrangbyscore myzset3 2 4 withscores 返回myzset3中顺序号从2到4的元素
Zcount返回集合中score在给定区间的数量
Zcard返回集合中的元素个数
语法:同scard
Zremrangebyrank删除集合中索引在指定区间的元素
例子:Zremrangbyrank myzset3 1 2 删除集合中索引下标1到2的元素
Zremrangbyscore删除集合中score在指定区间的元素
例子:zremrangbyscore myzset 2 5 删除集合中score2到5的元素
键值相关命令
Keys 返回满足指定pattern的所有key
例子:Keys my*返回my打头的所有key
keys *返回所有key
Exists确认一个key是否存在
例子:exits name name键是否存在,存在返回1
Del删除一个key
例子:del age删除age这个key
Expire设置一个key的国旗时间
例子:expire addr 10 对addr这个key设置10秒过期,ttl
keyname可以查看指定key的剩余时间
Move把key从一个数据库移动到另一个数据库
例子:move age 1,把age这个key从当前数据库移动到1数据库
Persist移除给定key的过期时间
例子:persist age取消age键的过期时间,使之是永不过期
Randomkey随机返回key空间的一个key
Rename重命名key
例子:rename age age_name 把key键重命名为age_new
Type返回值的类型
服务器相关命令
Ping测试连接是否存活,正常返回pong。。
Select选择数据库
例子:select 0 选中0数据库(redis中有0~15共16个数据库)
Quit退出连接
Dbsize返回当前数据库中key的数目
Info获得服务器的信息
Flushdb删除当前数据库中所有key,也就是清空当前数据库
Flashall删除所有数据库中的所有key
Redis高级应用
1、安全性
设置客户端连接后进行任何其他指定前需要使用的密码
修改配置文件requirepass选项,设置密码后可以登录到客户端,但是不能做其他操作,需要使用(auth密码 )来认证,或者可以在登录时候直接认证,如:redis-cli
-a 密码
2、主从复制
1)Master可以有多个slave
2)多个slave可以连接到同一个master以外,还可以连接到其他slave,这是为了当master宕机后,这个slave可以立刻变为master
3)主从复制不阻塞master
主从复制过程:
(1)slave与master建立连接,发送sync同步命令
(2)master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存
(3)后台完成保存后,就将此文件发送给slave
(4)slave将此文件保存到硬盘上
配置主从服务器:
只需要配置slave,配置slave只需要在slaave的配置文件中加入如下代码:
slaveof ip端口 指定master的ip和端口
Masterauth密码 指定master的密码
通过info命令可以查看谁是主谁是从,查看role字段
3、Redis事务处理
目前对事务的支持比较简单,只能保证一个客户端发起的事务中的命令可以连续执行,而中间不会插入其他客户端的命令。当一个客户端在连接中发出multi命令时,则个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。
mutil命令打开事务上下文,用exec执行
discard命令来取消事务
但是有局限,事务中某个命令出现错误时,这个命令无法回滚
使用watch命令来监控某个key的版本,如watch
key,当exec时,如果这个key从调用watch后被修改过,则整个事务会失败。也可以调用watch多次来监控多个key,这样可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样,如果连接断开,监控和事务都会被自动清除。exec,discard,unwatch命令都会清除连接中的所有监控。
4、持久化机制
Redis支持两种持久化方式:
1)snapshoting(快照)默认方式
2)Append-only file(缩写aof)方式
快照方式:将内存中的数据以快照的方式写入到二进制文件中,默认文件名为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。
如:save 300 10 # 300秒如果超过10个key被修改,则进行快照保存
aof方式:由于快照方式是在一定间隔做一次的,所以如果redis以外down的话会丢失最后一次快照后的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的命令来在内存中重建整个数据库的内容。
设置aof方式说明:
Appendonlyyes
#appendfsync always 每条命令一收到就写入,最慢,最安全的持久化
# appendfsync everysec每秒写一次
# appendfsync no 完全依赖操作系统,最快,最不靠谱
5、发布与订阅消息
Public tv1 name test 通过tv1这个通道发布name这个key的值为test
Subscribe tv1 订阅tv1 这个通道,在这个通道上发布的任何消息都会收到
6、虚拟内存的使用
把不经常访问的数据交换到磁盘上
相关配置:配置文件中vm开头的相关配置项目
使用键值对(key-value)形式存储数据
数据类型:String,List,Set,Zset
为了保证效率,数据都是缓存在内存中,也可以周期性的把更新的数据写入磁盘或者把修改操作写入到追加的记录文件
适用场合(新浪微博):
应用程序直接访问Redis数据库
应用程序直接访问Redis,只有当Redis访问失败时候才访问MYSQL
启动Redis
服务器端:redis-server命令,要指定配置文件,默认redis.conf
客户端:redis-cli
默认端口6379
后台启动:修改配置文件中的daemonize选项
停止:Pkill redis-server
String
类型:String类型是二进制安全的
语法:
set 设置键值 set key value
例如 set name zhangsan
get 获得键值 get key
例如 get name
Setnx 设置键值(已经存在不覆盖) setnx name value
Setex 设置键值(有效期)setex key
时间 value(单位:秒)
例如 set haircolor 10 red
Setrange
替换键值的一部分 setrange key
替换开始的下标
替换成的字符串
mset 设置多个键值
都成功或者都失败 mset key1 value1 key2 value2
Msetnx 设置多个键值
都成功或者都失败 ,不覆盖已经存在的值
例如:msetnx key1 val1 key2 val2
getset 获取旧的值,设置新的值,getset key
新值
Getrang 获得键值的子串儿 getrang key
开始下标
结束下标
mget 一次获得多个值 mget key1 key2 key3..
incr 自增1 incr key
incrby 加上指定数目,可以是负数 incrby key
数字
decr 自减1 decr key
Decrby 减去指定
是负数数目, decrby key
数字
Append 给键值追加内容 append key
要追加的字符串
Strlen 查看键值的长度 strlen key
Hash类型便于存储对象
hset 设置哈希表的一个键值
语法:hset哈希表名字
field1 val1
hget获取哈希表的一个键值
语法 hget哈希表名字
fieldname
hsetnx 类似hset,不同的是有值的话不覆盖
语法:hsetnx哈希表名字
field1 val1
hmset 批量设置多个键值
语法:hmset 哈希表名字
field1 val1 field2 val2
hmget获取多个键值
hmget哈希表名字 field1 field2…
hincrby哈希表中某个键值加指定数字
语法:hincrby哈希表名字
field1 要加的数字
hexists判断哈希表中某字段是否存在,存在返回1,否则返回0
语法:hexists哈希表名字 filed1
hlen 返回哈希表中键的个数
语法:hlen 哈希表名字
hdel删除指定的field
语法: hdel哈希表名字 要删除的field
hkeys返回哈希表中所有fields的名字
语法:hkeys哈希表名字
hvals 返回哈希表中所有value
语法:hvals哈希表的名字
hgetall 获取哈希表中全部的field和value
语法:hgetall哈希表名字
list类型 链表结构 可以从头部或者尾部添加删除元素,可以作为栈,也可以作为队列
lpush从头部压入一个字符串元素
语法:lpush链表名 值
lrange 链表名
0 -1
表示从头部的第一个元素取到尾部的第一个元素,也就是从头部取所有元素
rpush从尾部压入一个字符串元素
语法 rpush链表名 值
linsert 在元素前插入一个元素,头的方向为前
语法:linsert链表名
before 已有元素 要插入的元素
lset设置list中指定下标的元素值
语法:lset listname 下标 要设置的值
lrem从List中删除n个和value相同的元素(n<0从尾部删除,n=0全部删除)
语法:lrem listnamen value
Set类型:是string类型的无序集合,集合中不允许重复元素,对集合可以进行并集,交集,差集等操作
Sadd 向集合中添加元素
语法:sadd集合名 要添加的元素
例子:sadd myset1one向myset1中添加one
Smembers 查看集合中元素
语法:smembers 集合名
Srem 删除名称为key的set中的元素
语法:srem集合名 要删除的元素
例子:srem myset1one 从myset1中删除one
Spop随机返回并且删除名称为key的set中的一个元素
语法:spop集合名
例子:spop myset1从myset1中随机弹出一个元素,并且删除它
Sdiff 返回两个集合的差集,以第一个集合为标准
语法:sdiff集合1 集合2
例子:sdiff myset1 myset2返回myset1中与myset2不同的元素
Sdiffstroe 将两个集合的差集存储到另外一个集合
语法:sdiffstore集合3集合2 集合1 将集合1和集合2的差集存储在集合3中
Sinter返回所有给定集合的交集
语法:sinter myset1 myset2
Sinterstroe将取的差集存储在另外一个集合
语法:sinterstore集合3集合2集合1 将集合1和集合2的交集存储在集合3中
Sunion取所有给定集合的并集
语法:sunion集合1集合2
Sunionstore取所有给定集合的并集并且存储
语法:同sdiffstore和sinterstore
Smove 从第一个key对应的set中移除member并添加到第二个set中
语法:smove 集合1集合2 元素1 把元素1从集合1中移动到集合2中
Scard 返回名称为key的set的元素个数
语法:scard集合名
Sismember判断某元素是否为集合的元素,是的话返回1,否则返回0
语法:sismember集合名元素1 判断元素1是否是集合中元素
Srandmember随机返回名称为key的set的一个元素,但不删除元素
语法:srandmember集合名
zset类型:在set的基础上增加了一个顺序属性,这一属性在添加修改元素时候可以指定,每次指定后,zset会自动重新按照新的值调整顺序。可以理解为两列的Mysql表,一列存value,一列存顺序。
Zadd向名称为key的zset中添加元素member,score用于排序。如果该元素存在则更新其顺序
语法:zadd 集合名 顺序 元素
例子:zadd sset11 one 向集合sset1中添加元素one,顺序号为1
Zrang myzset 0 -1 withscores 取myzset中的所有元素,包含顺序号
Zrem删除名称为key的zset中的元素member
语法:zrem集合名 要删除的元素
Zincrby如果在名称为key的zset中已经存在元素member,则该元素的score增加increment,否则向该集合中添加该元素,其score的值为increment
语法:zincrby集合名 increment 元素
Zrank返回名称为key的zset中的member元素的排名(按score从小到大排序)即索引下标
语法:zrank集合名 元素
例子:zrank myzset3 two 返回myzset3中元素two的索引下标(下标从0开始)
Zrevrank 返回名称为key的zset中的member元素的排名(按score从大到小排序)即下标,先按照score降序排序,然后再找索引
Zrangbyscore myzset3 2 4 withscores 返回myzset3中顺序号从2到4的元素
Zcount返回集合中score在给定区间的数量
Zcard返回集合中的元素个数
语法:同scard
Zremrangebyrank删除集合中索引在指定区间的元素
例子:Zremrangbyrank myzset3 1 2 删除集合中索引下标1到2的元素
Zremrangbyscore删除集合中score在指定区间的元素
例子:zremrangbyscore myzset 2 5 删除集合中score2到5的元素
键值相关命令
Keys 返回满足指定pattern的所有key
例子:Keys my*返回my打头的所有key
keys *返回所有key
Exists确认一个key是否存在
例子:exits name name键是否存在,存在返回1
Del删除一个key
例子:del age删除age这个key
Expire设置一个key的国旗时间
例子:expire addr 10 对addr这个key设置10秒过期,ttl
keyname可以查看指定key的剩余时间
Move把key从一个数据库移动到另一个数据库
例子:move age 1,把age这个key从当前数据库移动到1数据库
Persist移除给定key的过期时间
例子:persist age取消age键的过期时间,使之是永不过期
Randomkey随机返回key空间的一个key
Rename重命名key
例子:rename age age_name 把key键重命名为age_new
Type返回值的类型
服务器相关命令
Ping测试连接是否存活,正常返回pong。。
Select选择数据库
例子:select 0 选中0数据库(redis中有0~15共16个数据库)
Quit退出连接
Dbsize返回当前数据库中key的数目
Info获得服务器的信息
Flushdb删除当前数据库中所有key,也就是清空当前数据库
Flashall删除所有数据库中的所有key
Redis高级应用
1、安全性
设置客户端连接后进行任何其他指定前需要使用的密码
修改配置文件requirepass选项,设置密码后可以登录到客户端,但是不能做其他操作,需要使用(auth密码 )来认证,或者可以在登录时候直接认证,如:redis-cli
-a 密码
2、主从复制
1)Master可以有多个slave
2)多个slave可以连接到同一个master以外,还可以连接到其他slave,这是为了当master宕机后,这个slave可以立刻变为master
3)主从复制不阻塞master
主从复制过程:
(1)slave与master建立连接,发送sync同步命令
(2)master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存
(3)后台完成保存后,就将此文件发送给slave
(4)slave将此文件保存到硬盘上
配置主从服务器:
只需要配置slave,配置slave只需要在slaave的配置文件中加入如下代码:
slaveof ip端口 指定master的ip和端口
Masterauth密码 指定master的密码
通过info命令可以查看谁是主谁是从,查看role字段
3、Redis事务处理
目前对事务的支持比较简单,只能保证一个客户端发起的事务中的命令可以连续执行,而中间不会插入其他客户端的命令。当一个客户端在连接中发出multi命令时,则个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。
mutil命令打开事务上下文,用exec执行
discard命令来取消事务
但是有局限,事务中某个命令出现错误时,这个命令无法回滚
使用watch命令来监控某个key的版本,如watch
key,当exec时,如果这个key从调用watch后被修改过,则整个事务会失败。也可以调用watch多次来监控多个key,这样可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样,如果连接断开,监控和事务都会被自动清除。exec,discard,unwatch命令都会清除连接中的所有监控。
4、持久化机制
Redis支持两种持久化方式:
1)snapshoting(快照)默认方式
2)Append-only file(缩写aof)方式
快照方式:将内存中的数据以快照的方式写入到二进制文件中,默认文件名为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。
如:save 300 10 # 300秒如果超过10个key被修改,则进行快照保存
aof方式:由于快照方式是在一定间隔做一次的,所以如果redis以外down的话会丢失最后一次快照后的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的命令来在内存中重建整个数据库的内容。
设置aof方式说明:
Appendonlyyes
#appendfsync always 每条命令一收到就写入,最慢,最安全的持久化
# appendfsync everysec每秒写一次
# appendfsync no 完全依赖操作系统,最快,最不靠谱
5、发布与订阅消息
Public tv1 name test 通过tv1这个通道发布name这个key的值为test
Subscribe tv1 订阅tv1 这个通道,在这个通道上发布的任何消息都会收到
6、虚拟内存的使用
把不经常访问的数据交换到磁盘上
相关配置:配置文件中vm开头的相关配置项目
相关文章推荐
- redis安装问题小结
- Redis偶发连接失败案例实战记录
- Redis中实现查找某个值的范围
- Redis和Memcached的区别详解
- 分割超大Redis数据库例子
- Redis总结笔记(一):安装和常用命令
- Redis sort 排序命令详解
- 用Redis实现微博关注关系
- redis中修改配置文件中的端口号 密码方法
- 在Ruby on Rails上使用Redis Store的方法
- Redis和Memcache的区别总结
- 在Node.js应用中使用Redis的方法简介
- Redis服务器的启动过程分析
- web 应用中常用的各种 cache详解
- 利用yum安装Redis的方法详解
- 从MySQL到Redis的简单数据库迁移方法
- 为啥懒 Redis 是更好的 Redis
- 利用Redis实现SQL伸缩的方法
- 在Redis数据库中实现分布式速率限制的方法
- redis2.8配置文件中文翻译版