酸酸哥教你redis.docx
- 文档编号:11349738
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:25
- 大小:24.53KB
酸酸哥教你redis.docx
《酸酸哥教你redis.docx》由会员分享,可在线阅读,更多相关《酸酸哥教你redis.docx(25页珍藏版)》请在冰点文库上搜索。
酸酸哥教你redis
酸酸哥教你Redis
1、introduction
redis是什么
Remote DIctionary Server(Redis) 由意大利程序员SalvatoreSanfilippo(antirez)写的key-value存储系统,Redis提供了一些丰富的数据结构,包括 lists,sets,orderedsets以及 hashes,当然还有和Memcached一样的 strings结构.Redis当然还包括了对这些数据结构的丰富操作
Redis的优点
∙性能极高 –Redis能支持超过100K+每秒的读写频率。
∙丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及OrderedSets数据类型操作。
∙原子–Redis的所有操作都是原子性的。
∙丰富的特性 –Redis还支持publish/subscribe(发布订阅),通知,key过期等等特性。
Redis遗憾之处
Redis不是BigData,数据都在内存中,无法以T为单位。
Redis不支持Ad-HocQuery,提供的只是数据结构的API,没有SQL一样的查询能力
Feature速览
∙所有数据都在内存中。
∙五种数据结构:
String/Hash/List/Set/OrderedSet。
∙数据过期时间支持。
∙不完全的事务支持。
∙服务端脚本:
使用LuaScript编写,类似存储过程的作用。
∙PubSub:
消息一对多发布订阅功能,起码Redis-Sentinel使用了它。
∙持久化:
支持定期导出内存的Snapshot与记录写操作日志的AppendOnlyFile两种模式。
∙Replication:
Master-Slave模式,Master可连接多个只读Slave,暂无专门的GeographicReplication支持。
∙Fail-Over:
Redis-Sentinel节点负责监控Master节点,在master失效时提升slave,独立的仲裁节点模式有效防止脑裂。
∙Sharding:
开发中的Redis-Cluser。
∙动态配置:
所有参数可用命令行动态配置不需重启,并重新写回配置文件中,对云上的大规模部署非常合适。
∙默认端口6379
与memcached一样,为了保证效率,数据都是缓存在
内存中。
区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录
文件,并且在此基础上实现了master-slave(主从)同步
redis安装(不阐述)
Redis之七种武器
String
Hash
List
Set
OrderedSet
pub/sub
transaction
1、string
Strings数据结构是简单的key-value类型,value其实不仅是String,也可以是数字。
使用Strings类型,你可以完全实现目前Memcached的功能,并且效率更高。
还可以享受Redis的定时持久化,操作日志及Replication等功能。
除了提供与Memcached一样的get、set、incr、decr等操作外,Redis还提供了下面一些操作:
∙获取字符串长度
∙往字符串append内容
∙设置和获取字符串的某一段内容
∙设置及获取字符串的某一位(bit)
∙批量设置一系列字符串的内容
set
redis127.0.0.1:
6379>setname“wengxuejie”
(integer)1
redis127.0.0.1:
6379>getname
"wengxuejie"
setnx
设置key对应的值为string类型的value。
如果key已经存在,
返回0,
nx是notexist的意思
redis127.0.0.1:
6379>getname
"wengxuejie"
redis127.0.0.1:
6379>setnxnamedaicao
(integer)0
redis127.0.0.1:
6379>getname
"wengxuejie"
setex
设置key对应的值为string类型的value,并指定此键值对应的有效期
redis127.0.0.1:
6379>setexcolor10red
OK
redis127.0.0.1:
6379>getcolor
"red"
redis127.0.0.1:
6379>getcolor
(nil)
setrange
设置指定key的value值的子字符串。
redis127.0.0.1:
6379>setaddr"wengxuejie@"
OK
redis127.0.0.1:
6379>setrangeaddr11
(integer)22
redis127.0.0.1:
6379>getaddr
"wengxuejie@"
mset
一次设置多个key的值
mget
一次获取多个key
redis127.0.0.1:
6379>msetkey1taoxukey2liangxiao
OK
redis127.0.0.1:
6379>mgetkey1key2
1)"taoxu"
2)"liangxiao"
incr
对key的值做加加操作,并返回新的值。
注意incr一个不是int的value会返回错误,incr一
个不存在的key,则设置key为1
redis127.0.0.1:
6379>setage20
OK
redis127.0.0.1:
6379>incrage
(integer)21
redis127.0.0.1:
6379>getage
"21"
incrby
同incr类似,加指定值,key不存在时候会设置key,并认为原来的value是0
redis127.0.0.1:
6379>getage
"21"
redis127.0.0.1:
6379>incrbyage5
(integer)26
decr
对key的值做的是减减操作,decr一个不存在key,则设置key为-1
redis127.0.0.1:
6379>getage
"26"
redis127.0.0.1:
6379>decrage
(integer)25
redis127.0.0.1:
6379>getage
"25"
decrby
同decr,减指定值。
redis127.0.0.1:
6379>getage
"25"
redis127.0.0.1:
6379>decrbyage5
(integer)20
redis127.0.0.1:
6379>getage
"20"
decrby完全是为了可读性,我们完全可以通过incrby一个负值来实现同样效果,反之一样
redis127.0.0.1:
6379>getage
"20"
redis127.0.0.1:
6379>incrbyage-5
(integer)15
redis127.0.0.1:
6379>getage
"15"
list
Lists就是链表,相信略有数据结构知识的人都应该能理解其结构。
使用Lists结构,我们可以轻松地实现最新消息排行等功能。
Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。
Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。
Redis的list类型其实就是一个每个子元素都是string类型的双向链表。
链表的最大长度是(2
的32次方)。
lpush
在key对应list的头部添加字符串元素
redis127.0.0.1:
6379>lpushmylist"world"
(integer)1
redis127.0.0.1:
6379>lpushmylist"hello"
(integer)2
redis127.0.0.1:
6379>lrangemylist0-1
1)"hello"
2)"world"
rpush
在key对应list的尾部添加字符串元素
redis127.0.0.1:
6379>rpushmylist2"hello"
(integer)1
redis127.0.0.1:
6379>rpushmylist2"world"
(integer)2
redis127.0.0.1:
6379>lrangemylist20-1
1)"hello"
2)"world"
linsert
在key对应list的特定位置之前或之后添加字符串元素
redis127.0.0.1:
6379>rpushmylist3"hello"
(integer)1
redis127.0.0.1:
6379>rpushmylist3"world"
(integer)2
redis127.0.0.1:
6379>linsertmylist3before"world""there"
(integer)3
redis127.0.0.1:
6379>lrangemylist30-1
1)"hello"
2)"there"
3)"world"
lset
设置list中指定下标的元素值(下标从0开始)
redis127.0.0.1:
6379>rpushmylist4"one"
(integer)1
redis127.0.0.1:
6379>rpushmylist4"two"
(integer)2
redis127.0.0.1:
6379>rpushmylist4"three"
(integer)3
redis127.0.0.1:
6379>lsetmylist40"four"
OK
redis127.0.0.1:
6379>lsetmylist4-2"five"
OK
redis127.0.0.1:
6379>lrangemylist40-1
1)"four"
2)"five"
3)"three"
lrem
从key对应list中删除count个和value相同的元素
count>0时,按从头到尾的顺序删除,具体如下:
redis127.0.0.1:
6379>rpushmylist5"hello"
(integer)1
redis127.0.0.1:
6379>rpushmylist5"hello"
(integer)2
redis127.0.0.1:
6379>rpushmylist5"foo"
(integer)3
redis127.0.0.1:
6379>rpushmylist5"hello"
(integer)4
redis127.0.0.1:
6379>lremmylist52"hello"
(integer)2
redis127.0.0.1:
6379>lrangemylist50-1
1)"foo"
2)"hello"
lpop
从list的头部删除元素,并返回删除元素
redis127.0.0.1:
6379>lrangemylist0-1
1)"hello"
2)"world"
redis127.0.0.1:
6379>lpopmylist
"hello"
redis127.0.0.1:
6379>lrangemylist0-1
1)"world"
rpop
从list的尾部删除元素,并返回删除元素
redis127.0.0.1:
6379>lrangemylist20-1
1)"hello"
2)"world"
redis127.0.0.1:
6379>rpopmylist2
"world"
redis127.0.0.1:
6379>lrangemylist20-1
1)"hello"
rpoplpush
从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,整个操
作是原子的.如果第一个list是空或者不存在返回nil
redis127.0.0.1:
6379>lrangemylist50-1
1)"three"
2)"foo"
3)"hello"
redis127.0.0.1:
6379>lrangemylist60-1
1)"hello"
2)"foo"
redis127.0.0.1:
6379>rpoplpushmylist5mylist6
"hello"
redis127.0.0.1:
6379>lrangemylist50-1
1)"three"
2)"foo"
redis127.0.0.1:
6379>lrangemylist60-1
1)"hello"
2)"hello"
3)"foo"
sets类型及操作
Sets就是一个集合,集合的概念就是一堆不重复值的组合。
利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
sadd
向名称为key的set中添加元素
redis127.0.0.1:
6379>saddmyset"hello"
(integer)1
redis127.0.0.1:
6379>saddmyset"world"
(integer)1
redis127.0.0.1:
6379>saddmyset"world"
(integer)0
redis127.0.0.1:
6379>smembersmyset
1)"world"
2)"hello"
srem
删除名称为key的set中的元素member
redis127.0.0.1:
6379>saddmyset2"one"
(integer)1
redis127.0.0.1:
6379>saddmyset2"two"
(integer)1
redis127.0.0.1:
6379>saddmyset2"three"
(integer)1
redis127.0.0.1:
6379>sremmyset2"one"
(integer)1
redis127.0.0.1:
6379>sremmyset2"four"
(integer)0
redis127.0.0.1:
6379>smembersmyset2
1)"three"
2)"two"
sortedsets类型及操作
和Sets相比,SortedSets增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的SortedSets,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
另外还可以用SortedSets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。
让重要的任务优先执行。
zadd
向名称为key的zset中添加元素member,score用于排序。
如果该元素已经存在,则根据
score更新该元素的顺序
redis127.0.0.1:
6379>zaddmyzset1"one"
(integer)1
redis127.0.0.1:
6379>zaddmyzset2"two"
(integer)1
redis127.0.0.1:
6379>zaddmyzset3"two"
(integer)0
redis127.0.0.1:
6379>zrangemyzset0-1withscores
1)"one"
2)"1"
3)"two"
4)"3"
zrem
删除名称为key的zset中的元素member
redis127.0.0.1:
6379>zrangemyzset0-1withscores
1)"one"
2)"1"
3)"two"
4)"3"
redis127.0.0.1:
6379>zremmyzsettwo
(integer)1
redis127.0.0.1:
6379>zrangemyzset0-1withscores
1)"one"
2)"1"
zincrby
如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则
向集合中添加该元素,其score的值为increment
redis127.0.0.1:
6379>zaddmyzset21"one"
(integer)1
redis127.0.0.1:
6379>zaddmyzset22"two"
(integer)1
redis127.0.0.1:
6379>zincrbymyzset22"one"
"3"
redis127.0.0.1:
6379>zrangemyzset20-1withscores
1)"two"
2)"2"
3)"one"
4)"3"
Hashs
在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。
这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。
而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。
hset
设置hashfield为指定值,如果key不存在,则先创建。
redis127.0.0.1:
6379>hsetmyhashfield1Hello
(integer)1
hsetnx
设置hashfield为指定值,如果key不存在,则先创建。
如果field已经存在,返回0,nx是
notexist的意思。
redis127.0.0.1:
6379>hsetnxmyhashfield"Hello"
(integer)1
redis127.0.0.1:
6379>hsetnxmyhashfield"Hello"
(integer)0
hmset
同时设置hash的多个field。
redis127.0.0.1:
6379>hmsetmyhashfield1Hellofield2World
OK
hget
获取指定的hashfield。
redis127.0.0.1:
6379>hgetmyhashfield1
"Hello"
redis127.0.0.1:
6379>hgetmyhashfield2
"World"
redis127.0.0.1:
6379>hgetmyhashfield3
(nil)
hmget
获取全部指定的hashfiled。
redis127.0.0.1:
6379>hmgetmyhashfield1field2field3
1)"Hello"
2)"World"
3)(nil)
hincrby
指定的hashfiled加上给定值。
redis127.0.0.1:
6379>hsetmyhashfield320
(integer)1
redis127.0.0.1:
6379>hgetmyhashfield3
"20"
redis127.0.0.1:
6379>hincrbymyhashfield3-8
(integer)12
redis127.0.0.1:
6379>hgetmyhashfield3
"12"
hdel
删除field
hlen
返回指定hash的field数量。
redis127.0.0.1:
6379>hlenmyhash
(integer)4
redis127.0.0.1:
6379>hdelmyhashfield1
(integer)1
redis127.0.0.1:
6379>hlenmyhash
(integer)3
hkeys
返回hash的所有field。
redis127.0.0.1:
6379>hkeysmyhash
1)"field2"
2)"field"
3)"field3"
hvals
返回hash的所有value。
redis127.0.0.1:
6379>hvalsmyhash
1)"World"
2)"Hello"
3)"12"
hgetall
获取某个hash中全部的filed及value。
redis127.0.0.1:
6379>hgetallmyhash
1)"field2"
2)"World"
3)"field"
4)"Hello"
5)"field3"
6)"12"
Publish/Subscribe
Redis支持这样一种特性,你可以将数据推到某个信息管道中,然后其它人可以通过订阅这些管道来获取推送过来的信息。
订阅信息管道
用一个客户端订阅管道
redis127.0.0.1:
6379>SUBSCRIBEchannelone
Readingmessages...(pressCtrl-Ctoquit)
1)"subscribe"
2)"channelone"
3)(integer)1
另一个客户端往这个管道推送信息
redis127.0.0.1:
6379>PUBLISHchannelonehello
(integer)1
redis127.0.0.1:
6379>PUBLISHchanneloneworld
(int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 酸酸 redis