Redis:remote dictionary service
1,优点
1、异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
2、支持丰富的数据类型:Redis支持Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
3、操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
4、多功能实用工具:Redis是一个多实用的工具,例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。
2,安装:
wget http:
/
/
download.redis.io
/
releases
/
redis
-
3.0
.
6.tar
.gz
tar xzf redis
-
3.0
.
6.tar
.gz
cd redis
-
3.0
.
6
make
或者make MALLOC=libc(强制使用libc的内容来编译)make install PREFIX=/usr/local/redis 将redis安装到/usr/local/redis目录中 //cd src && make install
安装完成后:
安装完成之后,可以在/usr/local/redis/bin目录下看到
redis-benchmark redis性能测试工具
redis-check-aof AOF文件修复工具
redis-check-rdb RDB文件检查工具
redis-cli Redis命令行客户端 *
redis-sentinel Redis软连接指向redis-server
redis-server Redis服务器 *运行以启动服务
3,启动:
(1)
/usr/local/redis/bin/redis-server
在redis的安装目录的bin目录,./redis-server
默认是前端启动模式,端口是6379
ctrl+c停止前端模式的redis
(2)守护进程
从redis的源码目录中复制redis.conf到redis的安装目录。/usr/local/redis/bin cp redis.conf /usr/local/redis/bin
安装vim yum install -y vim
修改配置文件 vim redis.conf
命令模式下搜索 /daemonize 改成yes
ps aux | grep redis 查看是否有有一个进程,它的名字包含了redis这个字符串
./redis-cli shutdown关闭redis服务器
指定IP地址和端口号的关闭redis服务器命令
./redis-cli -h 192.168.75.133 -p 1234 shutdown
./redis-cli -h 192.168.10.11 -p 6379 shutdown
./redis-cli空格-h 空格192.168.75.133(IP地址)空格 -p 空格1234(端口号)空格 shutdown
kill -9 <redis进程编号> 可以关闭服务器进程
4,配置:
daemonize 如果需要在后台运行,把该项改为yes
pidfile 配置多个pid的地址 默认在/var/run/redis.pid
bind 绑定ip,设置后只接受来自该ip的请求
port 监听端口,默认为6379
timeout 设置客户端连接时的超时时间,单位为秒
loglevel 分为4级,debug、verbose、notice、warning
logfile 配置log文件地址
databases 设置数据库的个数,默认使用的数据库为0
save 设置redis进行数据库镜像的频率
rdbcompression 在进行镜像备份时,是否进行压缩
Dbfilename 镜像备份文件的文件名
Dir 数据库镜像备份的文件放置路径
Slaveof 设置数据库为其他数据库的从数据库
Masterauth 主数据库连接需要的密码验证
Requirepass 设置登录时需要使用的密码
Maxclients 限制同时连接的客户数量
Maxmemory 设置redis能够使用的最大内存
Appendonly 开启append only模式
以下了解即可:
Appendfsync 设置对appendonly.aof文件同步的频率
vm-enabled 是否开启虚拟内存支持
vm-swap-file 设置虚拟内存的交换文件路径
vm-max-memory 设置redis使用的最大物理内存大小
vm-page-size 设置虚拟内存的页大小
vm-pages 设置交换文件的总的page数量
vm-max-threads 设置VM IO同时使用的线程数量
Glueoutputbuf 把小的输出缓存存放在一起
hash-max-zipmap-entries 设置hash的临界值
Activerehashing 重新hash
4.1 端口号
port 6379
6379在是手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字。MERZ长期以来被Redis作者antirez及其朋友当作愚蠢的代名词。后来Redis作者在开发Redis时就选用了这个端口。
4.2 数据库数量
databases 16
这里的数据库类似于MySQL的数据库,在一个MySQL的实例中可以有多个数据库,不同的应用使用不同的数据库,同样在一个redis实例中也可以有多个数据库。
可以使用 select <数据库ID>来选择使用哪个数据库。数据库0 <= ID <= datebases - 1
4.3 持久化方式
4.3.1 rdb
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”)
快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000
4.3.2 aof
也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。
aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)
appendonly yes //启用aof持久化方式
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no //完全依赖os,性能最好,持久化没保证
4.4 密码验证
Redis默认配置是不需要密码认证的,可以启用Redis的认证密码,增加Redis服务器的安全性。
1、在redis.conf下找到:
取消注释,foobared修改为要使用的密码。
2、重启redis服务器
# ./redis-cli shutdown 停止
# ./redis-server redis.conf 启动
3、客户端使用密码登录:
./redis-cli -a 123456
# ./redis-cli -h 127.0.0.1 -p 6379 -a myPassword
或者
# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> auth myPassword
OK
4、如果Redis服务器,使用了集群。除了在master中配置密码外,也需要在slave中进行相应配置。在slave的配置文件中找到masterauth<master-password>
5,安全
Redis的安全性???(由以下4种方式)
1.用ACL控制器安全性。
2.在redis.conf配置文件增加下面这一行配置,即可把redis绑定在单个接口上(但并不是只有接受这个网卡的数据)。
bind 127.0.0.1
3.给redis加上较长密码(无需要记住)
4.在redis.conf配置启用认证功能。
5.SSL代理
6.禁用指定命令。
6,常用命令:
select num#选择库,默认在0库,共16个库
auth liweijie#授权用户所需密码(密码就是redis.conf中配置的密码)
flushdb#清空数据库。
String(字符串)类型:
set name lijie#设置键name的值为lijie
get name#获取name的值。
keys *#查询所有的键。
setnx name liweijie#如果键已存在则返回0,不更新,防止覆盖。
setex haircolor 10 red #设置键的值的有效期为10秒。
setrange email 6 lampbre.com#替换键的值从第6个字符开始换为lampbre.com
mset name1 李大伟 name2 李小伟#设置多个键的值。
msetnxname1 张三 name3 李四#判断键是否存在,不存在则设置,否则不设置返回0
mget name1 name2 name3#一次获取多个键的值。
getset name1 Tom#重新设置键的值,并返回旧的键值。
getrange email 6 18#截取email键的值,从第6-18位间的字符。
incr uid#每次自增1 (如果key中uid不存在,则设置并从0开始,下同)
incrby uid 5#每次自增5
incrby uid -5#每次自减5
decr uid #每次自减1
decrby uid 5#每次自减5
appendname1 @126.com#给name1的值,添加字符串@126.com
strlenname1#返回键name1的值的长度。
*************************************************************************
Hashes(哈希)类型:
hset user:001 name liweijie#哈希设置用户user:001的name键值为liweijie
hset user:001 age 21#同样,增加一个age键值为21
hsetnx user:001 age 22#同上,但检测键是否存在。若不存在创建。
hmset user:002 name liweijie2 age 26 sex 1#同时设置多个键的值。
hget user:001 name#哈希获取用户user:001的name键的值。
hget user:001 age #同上。
hmget user:001 name age sex#获取多个指定的键的值。
hgetall user:001#获取所有键的值。
hincrbyuser:001 age -8#在指定键上加上给定的值。
hexists user:001 sex#检测指定的键值是否存在。
hlen user:001#返回指定哈希的键个数/字段个数。
hdel user:001 sex#删除指定(user:001)哈希的指定字段或是键值。
hkeys user:003#返回哈希里所有字段或是键值。
*********************************************************************
Lists(链表)类型及操作(棧或队列):
lpush mylist "world"#从头部插入字符串
lpush mylist "hello"#同上
lrange mylist 0 -1#获取从0到最后一个如[1) "hello" 2) "world"]
rpush mylist "jiejie"#在尾部插入
linsert mylist before "hello" "this is linsert" #指定插入位置(在hello之前插入)。
lset mylist 0 "what"#设置修改指定下标的值。
lrem mylist 1 "hello"#删除(1个)一个值为hello的元素。(n<0从尾部删除,n=0全部删除)
ltrim mylist 1 2 #保留表中下标为1/2的元素。
lpop mylist#弹出开头元素并返回。
rpop mylist#弹出尾部元素并返回。
rpoplpush mylist mylist2 #从mylist尾部弹出插入到mylist2的头部。
lindex mylist 0#获取表下标为0的元素值。
llen mylist#返回表元素个数(相当于count($arr ))。
*********************************************************************
sets(集合)类型及操作(好友推荐、blog、tag功能):
smembers myset#查看myset集合中所有元素值。
sadd myset "hello"#向mysets集合中添加一个值hello
srem myset "hello"#删除myset集合中名称为hello的元素。
spop myset #随机弹出并返回mysets中的一个元素。
sdiff myset2 myset3#返回myset2中的与myset3的差集(以myset2为准)。
sdiffstore myset4 myset2 myset3#返回myset2中的与myset3的差集,并存入myset4中去。
sinter myset2 myset3#返回myset2与myset3的交集。
sinterstore myset5 myset2 myset3#返回myset2与myset3的交集,并存入myset5中去。
sunion myset2 myset3#求并集(去重复)
sunionstore myset6 myset2 myset3#求并集,并存入myset6中去。
smove myset2 myset3 "three"#将myset2中的three移到myset3中去。
scard myset2#返回元素个数。
sismember myset2 "one"#判断元素one是不是myset2集合的(相当于is_array())。
srandmember myset2#随机返回myset2集合中的一个元素,但不删除(相当于array_rand())。
*********************************************************************
sorted sets(有序集合)类型及操作(以scores排序):
zadd myzset 1 "one"#向顺序1的添加元素one
zadd myzset 2 "two"#同上。
zadd myzset 3 "two"#相当于更新顺序为2的值
zrange myzset 0 -1 withscores#查看所有元素并带上排序(默认升序)。
zrem myzset "two"#删除two
zincrby myzset 2 "two"#将two的顺序值加上2
zrank myzset "two"#返回集合中元素的索引下标值。
zrevrank myzset two#元素反转并返回新下标值。
zrevrange myzset 0 -1 withscores#按顺序反转(相当于降序排序)
zrangebyscore myzset 1 10 withscores#返回顺序为1-10的元素(可做分页)。
zcount myzset 1 10 #返回顺序在1-10之间元素的个数。
zcard myzset#返回集合中所有元素的个数。
zremrangebyrank myzset 1 2#删除集合中下标为1到2的元素。
zremrangebyscore myzset 1 10#删除集合中顺序为1到10的元素。
Redis常用命令
键/值相关命令。
keys * #查询所有
keys user*#查询指定的
exists user:001#判断是否存在。
del name#删除指定的键。
expire addr 10#设置过期时间
ttl addr#查询过期时间
select 0 #选择数据库
move age 1#将age移到1数据库。
get age #获取
persist age#移除age的过期时间。
randomkey#随机返回一个key
rename name1 name2#重命名键
type myset#返回键的类型。
ping #测试redis连接是否存活。
echo lamp#输出一个lamp
select 10#选择数据库。
quit/exit/crtl+C#退出客户端
dbsize#返回库里的键的个数。
服务器相关命令:
info#显示redis服务器的相关信息。
config get */loglevel #返回所有/指定的配置信息。
flushdb#删除当前库中的所有键/表。
flushall#删除所有数据库中的所有键/表