您的位置:首页 > 数据库 > Redis

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字段
 
3Redis事务处理
目前对事务的支持比较简单,只能保证一个客户端发起的事务中的命令可以连续执行,而中间不会插入其他客户端的命令。当一个客户端在连接中发出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