set:设置key对应的值为string类型的value set name lijie
setnx 设置key对应的值为string类型的value 如果key 已经存在,返回0,成功返回1 nx是not exist的意思
setex:设置key对应的值为string类型的value,并指定此键值对应的有效期 setex haircolor 10 red 有效期10秒
setrange设置指定key的value值的子字符串
例如我们希望将lijie的126邮箱替换为gmail邮箱
set email lijie@126.com
setrange email 6 gmail.com 6表示下标 表示从第6个字符开始替换
mset:一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置
msetnx:一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key
getset 设置key的值 并返回key的旧值
getrange:获取key的value值的子字符串
mget 一次获取多个key的值,如果对应的key不存在 则对应返回nil
incr 对key值做加加操作 并返回新的值
incrby 加指定值 key不存在会设置key,并认为原来的value是0
append:给指定的key的字符串追加value 返回新字符串的长度
strlen:取指定key的value值的长度
二 hashes类型及操作
Redis hash是一个string类型的field和value的映射表。它的添加 删除操作是0(1)(平均)
hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存。并且可以更方便的存储整个对象
hset:设置hash field为指定值 如果key不存在,则先创建
hsetnx 设置hash field为指定值 如果key不存在,则先创建.如果存在返回0
hmset 同时设置hash的多个field
hincrby 指定的hash field 加上给定值
hexists 测试指定field是否存在
hlen: 指定hash的field数量
hdel 删除指定hash的field
hkeys:返回hash的所有field
hvals:返回hash的所有value
hgetall:返回某个hash中所有的field和value
三
lists 类型及操作
list是一个链表结构主要功能是push pop 获取一个范围的所有值
操作中key理解为链表的名字 redis的list类型其实就是一个每个元素都是string类型的
双向链表。我们可以通过push pop操作从链表的头部或者尾部添加删除元素,这样list即可以作为栈,又可以作为队列
lpush :在key对应list的头部添加字符串元素
lpush mylist1 word 向链表添加元素
lrange mylist1 0 -1 获取mylist1所有元素
rpush :在key对应list的尾部添加字符串元素
rpush mylist2 word
rpush mylist2 hello
lrange mylist2 0 -1
linsert 在key对应list的特定位置前或后添加字符串元素
lpush list3 one
lpush list3 two
linsert list3 before one three
lset 设置list中指定下标的元素值
lrem 从key对应的list中删除n个和value相同的元素
ltrim 保留指定key的值范围内的数据
lpop 从list的头部删除元 并返回删除元素
rpoplpush 从第一个list的尾部删除元素 并添加到第二个list的头部
lindex 返回名称为key的list中index位置的元素
llen:返回key对应list的长度
四
sets类型及操作
set是集合 它是string类型的无序集合。 set是通过hash table实现的 添加 删除 和查找的复杂度都是0(1). 对集合我们可以取并集 交集 差集。通过这些操作我们可以实现sns中的好友推荐等
sadd 向名称为key的set中添加元素
srem 删除名称为key的set中的元素
spop 随机返回并删除名称为key的set中一个元素
sdiff:返回所有给定key与第一key的差集
sinter 返回所有给定key的交集
sinterstore 返回所有给定key的交集 并将结果存在另一个key
sunion 返回所有给定key的并集
smove 从第一个key对应的set中移除member并添加到第二个对应的set中
scard 返回名称为key的set的元素个数
sismember 测试member是否是名称为key的set的元素
srandmember 随机返回名称为key的set的一个元素,但不删除元素
五
sorted sets类型及操作
sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一
属性在添加修改元素时可以指定,每次指定后,zset会自动重新按新的值调整顺序
可以理解为有2列的mysql表 一列存value 一列存顺序 操作中key理解为zset的名字。
zadd 向名称为key的zset中添加元素member,score用于排序。如果该元素存在
则更新其顺序
zrem 删除名称为key的zset中的元素member
zincrby 如果在名称为key的zset中已经存在元素member
zrank 返回名称为key的zset中member元素的排名(按score从小到大排序)即下标
zrevrank 返回名称为key的zset中member元素的排名(按score从大到小排序)即下标
zcount 返回集合中score在给定区间内的数量
六 redis的常用命令及高级应用
keys *
keys my*
exist:确认一个key是否存在
del 删除一个key
expire :设置一个key的过期时间
ttl:获取一个key的有效时长
move 把当前数据库中的key转移到其他数据库中
persist:移除给定key的过期时间
rename : 重命名
rename age age_new
type 返回值的类型
type addr
ping:测试连接是否存活
echo: 在命令行打印一些内容
select表示选择数据库
redis的数据库编号从0~15 我们可以选择任意一个数据库进行数据的存储
当选择16时,报错,说明没有编号为16的这个数据库
quit exit 都表示退出连接
info:获取服务器的信息和统计
config get 实时传储收到的请求
config get dir 获取dir这个参数配置的值
获取全部参数的配置值也很简单 只需要执行 config get * 即可将全部的值都显示出来
flushdb 删除当前选择数据库中所有key
flushall 删除所有数据库中所有key
redis 高级实用特性
1,安全性:设置客户端连接后进行任何其他指定前需要使用的密码
因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行
150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解
配置
requirepass bejing
usr/local/redis/bin/redis-cli
keys *
auth beijing
或者
usr/local/redis/bin/redis-cli -a beijing
取消密码验证后
2,主从复制
redis主从复制配置和使用都非常简单 通过主从复制可以允许多个slave server 拥有和master server相同的数据库副本。
redis主从复制过程
1,slave与,master建立连接,发送sync同步命令
2,master会启动一个后台进程 将数据库快照保存到文件中
同时master主进程会开始收集新的写命令并缓存
3,后台完成保存后,就将次文件发送给slave
4,slave将此文件保存到硬盘上
配置主从服务器:
配置slave服务器很简单 只需要在slave的配置文件中加入以下配置
slaveof 192.168.2.201 6379 #指定master的ip和端口
masterauth lamp#这是主机的密码
配置从redis
vim /etc/redis.conf
主redis
从redis
3,事务处理
redis对事务的支持目前还比较简单 redis 只能保证一个client 发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令。
set age 100
get age
multi
set age 10
set age 20
exec
取消一个事务:discard
multi
incr age
incr name
exec
取消事务
事务不完美
一个成功 一个失败
4,持久化机制
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证
持久化
1,snapshotting(快照)也是默认方式
将内存中的数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb.
可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
2,Append-only file(缩写aof)的方式
由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。
aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改
可以通过配置文件告诉redis 我们想要通过fsync函数强制os写入到磁盘的时机
appendonly yes//启用aof持久化方式
appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
appendfsync no //完全依赖os 性能最好 持久化没保证
配置文件
5,发布订阅消息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合
redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过
subscribe和psubscribe命令向redis server 订阅自己感兴趣的消息类型,redis将信息类型称为通道。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息
接收信息
接收信息
发送信息
6,虚拟内存的使用
redis的虚拟内存就是把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。 尤其是对于redis这样的内存数据库,内存总是不够的。除了可以将数据分割到多个redis server外 另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。
vm相关配置
vm-enabled yes //开启vm功能
vm-swap-file /tmp/redis.swap //#交换出来的value保存的文件路径
vm-max-memory 100000 //redis使用的最大内存上限
vm-page-size 32 //每个页面的大小32字节
vm-pages 134217728 最多使用多少个页面
vm-max-threads //用于执行value对象换入的工作线程数量
网友评论