Redis 学习笔记
2016-03-08 16:42
429 查看
1Redis优势
性能极高–Redis能读的速度是110000次/s,写的速度是81000次/s。丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及OrderedSets数据类型操作。
原子–Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性–Redis还支持publish/subscribe,通知,key过期等等特性。
2.1安装redis
下载redis安装包(如:redis-2.8.17.tar.gz)tar-zxvfredis-2.8.17.tar.gz cdredis-2.8.17 make sudomakeinstall
2.2后台启动服务端
nohupredis-server&
注:redis-server默认启动端口是6379,没有密码
如果不使用默认配置文件,启动时可以加上配置文件
nohupredis-server~/soft/redis-2.8.17/redis.conf&
2.3启动客户端、验证
127.0.0.1:6379>ping PONG 127.0.0.1:6379>setvar"helloworld" OK 127.0.0.1:6379>getvar "helloworld"
2.4退出
关闭redis-serverredis-clishutdown
例子
$ps-ef|grepredis root2342219813010:59pts/500:00:08redis-server*:6379 $sudoredis-clishutdown [23422]05Mar12:11:29.301#Userrequestedshutdown... [23422]05Mar12:11:29.301*SavingthefinalRDBsnapshotbeforeexiting. [23422]05Mar12:11:29.314*DBsavedondisk [23422]05Mar12:11:29.314#Redisisnowreadytoexit,byebye... [1]+Donesudoredis-server(wd:~/soft/redis-2.10.3) (wdnow:~/soft/redis-2.8.17) $ps-ef|grepredis wzh944343056319813012:11pts/500:00:00grepredis
注:如果设置上密码后,单纯的redis-cli是关不掉的,必须加上ip、port、passwd
sudoredis-cli-hhost-pport-apasswdshutdown
退出客户端
localhost:6379>QUIT
2.5设立密码
打开redis.conf找到requirepass,去掉默认,修改requirepassyourpassword
验证密码的正确性
localhost:6379>authjihite OK
2.6远程连接
需要已经安装redis,可以使用redis-cli命令redis-cli-hhost-pport-apassword
2.7查看redis-server统计信息
INFO
3.Reiskey
Redis是key-value的数据库,Redis的键用于管理Redis的键,基本语法是COMMANDKEY_NAME
例子:
localhost:6379>SETvarredis OK localhost:6379>GETvar "redis" localhost:6379>DELvar (integer)1 localhost:6379>GETvar (nil)
注:redis命令不区分大小写,所以getvar和GETvar是等价的
序号 | Rediskeys命令及描述 |
---|---|
1 | DELkey该命令用于在key存在是删除key。 |
2 | DUMPkey序列化给定key,并返回被序列化的值。 |
3 | EXISTSkey检查给定key是否存在。 |
4 | EXPIREkeyseconds为给定key设置过期时间。 |
5 | EXPIREATkeytimestampEXPIREAT的作用和EXPIRE类似,都用于为key设置过期时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unixtimestamp)。 |
6 | PEXPIREkeymilliseconds设置key的过期时间亿以毫秒计。 |
7 | PEXPIREATkeymilliseconds-timestamp设置key过期时间的时间戳(unixtimestamp)以毫秒计 |
8 | KEYSpattern查找所有符合给定模式(pattern)的key。例如keys*返回所有的key |
9 | MOVEkeydb将当前数据库的key移动到给定的数据库db当中。 |
10 | PERSISTkey移除key的过期时间,key将持久保持。 |
11 | PTTLkey以毫秒为单位返回key的剩余的过期时间。 |
12 | TTLkey以秒为单位,返回给定key的剩余生存时间(TTL,timetolive)。 |
13 | RANDOMKEY从当前数据库中随机返回一个key。 |
14 | RENAMEkeynewkey修改key的名称 |
15 | RENAMENXkeynewkey仅当newkey不存在时,将key改名为newkey。 |
16 | TYPEkey返回key所储存的值的类型。 |
4.Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sortedset:有序集合)。4.1String(字符串)
是Redis最基本的数据类型,可以理解成与Memcached一模一样的类型,一个key对应一个value二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象
一个键最大能存储512MB
例子
setmyredis'kmonkeywyl' getmyredis
说明:利用set给变量var赋值“Stringtype”;利用get获得变量var的值
4.2Hash(哈希)
是一个键值对集合是一个string类型的field和value的映射表,hash特别适合用于存储对象
例子
//建立哈希,并赋值 HMSETuser:001usernamewylpassword111age34 OK //列出哈希的内容 127.0.0.1:6379>HGETALLuser:001 1)"username" 2)"wyl" 3)"password" 4)"111" 5)"age" 6)"34" //更改哈希中的某一个值 HSETuser:001password12345 (integer)0 //再次列出哈希的内容 127.0.0.1:6379>HGETALLuser:001 1)"username" 2)"wyl" 3)"password" 4)"12345" 5)"age" 6)"34"
说明
var:1是键值,每个hash可以存储232-1键值对(40多亿)
HMSET用于建立hash对象,HGETALL用于获取hash对象
4.3LIST(列表)
例子//新建一个list叫做mylist,并在列表头部插入元素"1"
lpushmylist"1"
//在mylist右侧插入元素"2"
rpushmylist"2"
//在mylist左侧插入元素"0"
lpushmylist"0"
//列出mylist中从编号0到编号1的元素
lrangemylist01
//列出mylist中从编号0到倒数第一个元素
lrangemylist0-1
说明
lpush往列表的前边插入;lrange后面的数字是范围(闭区间)
redis中的lists在底层实现上并不是数组,而是链表.所以插入数据快,但定位性能操作较差。
lists的常用操作包括lpush、rpush、lpush,lrange等
列表最多可存储232-1元素(4294967295,每个列表可存储40多亿)。
4.4Set(集合)
Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
例子
//向集合myset中加入新元素"wyl"
saddmyset"wyl"
(integer)1
saddmyset"kmonkey"
(integer)1
//列出集合myset中的所有元素
smembersmyset
1)"wyl"
2)"kmonkey"
//判断元素1是否在集合myset中,返回1表示存在
sismembermyset"wyl"
(integer)1
//判断元素是否在集合myset中,返回0表示不存在
sismembermyset"wangyanling"
(integer)0
//新建一个新的集合yourset
saddyourset"1"
(integer)1
saddyourset"2"
(integer)1
smembersyourset
1)"1"
2)"2"
//对两个集合求并集
sunionmysetyourset
1)"1"
2)"wyl"
3)"2"
4)"kmonkey"
说明
set往集合中插入元素,smembers列举出集合中的元素
成功插入返回1;错误插入返回0,例子中mongodb第二次插入时,因已经存在,故插入失败。
4.5zset(sortedsete:有序集合)
zset和set一样也是String类型的集合,且不允许元素重复zset和set不同的地方在于zset关联一个double类型的分数,redis通过分数对集合中的元素排序
zset的元素是唯一的,但是分数是可以重复的
例子
zaddmyzset1baidu.com
(integer)1
//向myzset中新增一个元素360.com,赋予它的序号是3
zaddmyzset3360.com
(integer)1
//向myzset中新增一个元素google.com,赋予它的序号是2
zaddmyzset2google.com
(integer)1
//列出myzset的所有元素,同时列出其序号,可以看出myzset已经是有序的了。
zrangemyzset0-1withscores
1)"baidu.com"
2)"1"
3)"google.com"
4)"2"
5)"360.com"
6)"3"
//只列出myzset的元素
zrangemyzset0-1
1)"baidu.com"
2)"google.com"
3)"360.com"
成功插入返回1,否则返回0。插入已存在元素失败--返回0
分数为float(可正、负、0)
5.RedisHyperLogLog
RedisHyperLogLog是用来做基数统计的算法。优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
注:因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,因此不会返回输入的各个元素。
基数是什么?对于["abc","abc","2","3"],基数是["abc","2","3"],个数是3.
例子
localhost:6379>pfaddjshredis
(integer)1
localhost:6379>pfaddjshredis
(integer)0
localhost:6379>pfaddjshmongodb
(integer)1
localhost:6379>pfaddjshrabbitmq
(integer)1
localhost:6379>pfcountjsh
(integer)3
localhost:6379>pfaddjsh2redis
(integer)1
localhost:6379>pfaddjsh2a
(integer)1
localhost:6379>pfcountjsh2
(integer)2
localhost:6379>pfmergejshjsh2
OK
localhost:6379>pfcountjsh
(integer)4
localhost:6379>pfcountjsh2
(integer)2
说明:
pfaddkeyele[ele2...]:添加指定元素到HyperLogLog中,
pfcountkey:返回给定HyperLogLog的基数估算值
pfmergedestkeysrckey[srckey2....]:讲多个HyperLogLog合并到一个第一个HyperLogLog中
6.Redis发布订阅
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。
原理:下图展示了三个客户端client1,client2,client5订阅了频道channel1
当有新消息通过PUBLISH发送给channel1时,这时候channel1就会把消息同时发布给订阅者
例子
创建订阅频道redisChat
localhost:6379>subscriberedisChat
Readingmessages...(pressCtrl-Ctoquit)
1)"subscribe"
2)"redisChat"
3)(integer)1
打开几个客户端,订阅channelredisChat
localhost:6379>psubscriberedisChat
Readingmessages...(pressCtrl-Ctoquit)
1)"psubscribe"
2)"redisChat"
3)(integer)1
然后给channelredisChat发送消息“HelloWorld”
localhost:6379>publishredisChat"HelloWorld"
(integer)1
客户端会收到消息
Readingmessages...(pressCtrl-Ctoquit)
1)"pmessage"
2)"redisChat"
3)"redisChat"
4)"HelloWorld"
7.Redis事务
事务是一个单独的操作集合,事务中的命令有顺序,是一个原子操作(事务中的命令要么全部执行,要么全部不执行),执行一个事务中的命令时不会被其他命令打断。一个事务从开始到结束经过以下三个阶段:
开始事务
命令入队
执行事务
例子
localhost:6379>MULTI
OK
localhost:6379>setnamejihite
QUEUED
localhost:6379>getname
QUEUED
localhost:6379>saddlanguage"c++""python""java"
QUEUED
localhost:6379>smemberslanguage
QUEUED
localhost:6379>exec
1)OK
2)"jihite"
3)(integer)3
4)1)"java"
2)"python"
3)"c++"
说明:事务以MULTI开始,以EXEC结束
8.Redis脚本
Redis脚本使用Lua解释器来执行脚本。执行脚本的常用命令为EVAL。基本语法EVALscriptnumkeyskey[key...]arg[arg...]
例子
localhost:6379>EVAL"return{KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"2key1key2firstsecond
1)"key1"
2)"key2"
3)"first"
4)"second"
9.数据备份与恢复
数据备份localhost:6379>save
OK
改命令会在redis的安装目录中创建文件dump.rdb,并把数据保存在该文件中。
查看redis的安装目录
localhost:6379>configgetdir
1)"dir"
2)"/home/jihite/soft/redis-2.8.17"
数据恢复
只需将备份文件dump.rdb拷贝到redis的安装目录即可。
10.数据库操作
Redis中,一共有16个数据库,分别是0~15,一般情况下,进入数据库默认编号是0,如果我们要进入指定数据库,可以用select语句切换到编号为3的数据库
localhost:6379>select3
OK
localhost:6379[3]>
查看数据库中所有的键值
localhost:6379[1]>seta1
OK
localhost:6379[1]>setb2
OK
localhost:6379[1]>keys*
1)"b"
2)"a"
返回当前数据库中所有key的数目:dbsize
删除当前数据库中的所有key:flushdb
清空所有数据库中的所有key:flushall
把当前数据库中的key转移到指定数据库:moveaaim_db,例:
localhost:6379[1]>setzsss
OK
localhost:6379[1]>movez0
(integer)1
localhost:6379[1]>select0
OK
localhost:6379>getz
"sss"
相关文章推荐
- Redis入门很简单之八【Spring Data Redis初探】
- Redis入门很简单之七【使用Jedis实现客户端Sharding】
- Redis入门很简单之六【Jedis常见操作】
- Redis入门很简单之五【Jedis和Spring的整合】
- Redis入门很简单之四【初识Jedis】
- Redis入门很简单之三【常见参数配置】
- jedis调用redis之List
- Redis事务
- 在linux环境下安装redis
- 关于Redis中交互的过程
- jedis调用redis之String数据Key-Value
- jedis调用redis之源码
- redis主配置文件
- Redis配置文件各项参数说明
- Redis配置文件各项参数说明
- linux下redis安装
- Redis入门很简单之二【常见操作命令】
- Redis入门很简单之一【简介与环境搭建】
- Ubuntu install Redis
- IDEA编译tomcat-redis-session-manager出的错误