Redis特性和应用场景 您所在的位置:网站首页 Redis数据库特点及应用场景 Redis特性和应用场景

Redis特性和应用场景

2024-07-12 04:24| 来源: 网络整理| 查看: 265

Redis特性

速度快

Redis使用标准C编写实现,而且将所有数据加载到内存中,所以速度非常快。官方提供的数据表明,在一个普通的Linux机器上,Redis读写速度分别达到81000/s和110000/s。

数据结构

可以将Redis看做“数据结构服务器”。目前,Redis支持5种数据结构。

持久化

由于所有数据保持在内存中,所以对数据的更新将异步地保存到磁盘上,Redis提供了一些策略来保存数据,比如根据时间或更新次数。数据超过内存,使用swap,保证数据;

memcacache不能持久化,mongo是部分在内存;

自动操作

Redis对不同数据类型的操作是自动的,因此设置或增加key值,从一个集合中增加或删除一个元素都能安全的操作。

支持多种语言

Redis支持多种语言,诸如Ruby,Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure等。

主-从复制

Redis支持简单而快速的主-从复制。

官方提供了一个数据,Slave在21秒即完成了对Amazon网站10Gkey set的复制。

Sharding

很容易将数据分布到多个Redis实例中,但这主要看该语言是否支持。目前支持Sharding功能的语言只有PHP、Ruby和Scala。

1.   redis数据使用方式

redis 的作者antirez曾笑称其为一个数据结构服务器(data structures server),redis的所有功能就是将数据以其固有的几种结构保存,并提供给用户操作这几种结构的接口。我们可以想象我们在各种语言中的那些固有数据类型及其操作。

Redis的几种使用方式

StringsHashsListsSetsSorted SetsPub/Sub

Redis的七种特性以及适合的应用场景:

1.1. Strings

Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字。使用Strings类型,完全实现目前 Memcached 的功能,并且效率更高。还可以享受Redis的定时持久化,操作日志及 Replication等功能。除了提供与 Memcached 一样的get、set、incr、decr 等操作外,Redis还提供了下面一些操作:

获取字符串长度           strlen往字符串append内容 append设置和获取字符串的某一段内容 setrange getrange设置及获取字符串的某一位getrange批量设置一系列字符串的内容

String是最简单的数据类型,一个key对应一个Value,String是二进制安全的。它可以包含任何数据,图片或者其他序列化后的对象

方法

说明

特性

set

设置key对应的的值为String类型的value

   

get

获取对应key对应的String的值,如果不存在返回nil

   

setnx

设置可以为对应的值为String类型的value,如果key存在返回0不覆盖,不存在返回1

nx的意思为not exist

Set the value of a key, only if the key does not exist

setex

置key对应的值为String类型的value,并指定此键值对应的有效期

SETEX key seconds value

例:setex mykey 10 你好

setrange

设置key的value的子字符串

setrange key 位置 替换的内容

如果替换内容没有原value长,则原value剩余的内容将被保留

mset

一次设置多个key的值,成功返回ok,失败返回0,要成功都成功,要不成功全部失败。

mset key1 内容一 key2 内容二

msetnx

一次设置多个key的值,成功返回ok,失败返回0,不覆盖已经存在的值,要成功都成功,要失败都失败。

   

getset

设置key的值并返回key的旧值

getset key newValuse

getrange

获取key对应的value子字符串

getrange key 0 5 //获取前6个字符

mget

批量获取

mget key1 key2 key3 //没有设置则返回空

incr

对key的值做增加操作,并返回新的值

   +1

incrby

对可以的value加指定的值,

key如果不存在会设置key并value为0

incrby key1 5 //对key1的值加5

decr

对key的值做减减操作

    -1

decrby

对key的值减去指定值

   

append

给指定key的字符串追加value,返回新的字符串长度

   

strlen

取指定key的value值的长度

   

1.2. Hashs

在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值,比如用户的昵称、年龄、性别、积分等,这时候在需要修改其中某一项时,通常需要将所有值取出反序列化后,修改某一项的值,再序列化存储回去。这样不仅增大了开销,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。

 

它是一个String类型的field和value的映射表,它的添加和删除都是平均的,hash特别适合用于存储对象,对于将对象存储成字符串而言,hash会占用更少的内存,并且可以更方便的存取整个对象. 它和java的HashMap完全类似

方法

说明

特性

hset

设置一个hash 的field为指定值,如果key不存在则先创建

hset tab ke1 val1

hget

获取某个hash的某个field值

hget tab ke1

hsetnx

类似string只是操作的是hash

   

hmset

批量设置hash的内容

   

hmget

获取hash表的全部key值

Hmget key field1 field2

hincrby

给hash表的某个字段增加值

   

hexists

判断hash表中某个key是否存在

   

hlen

返回hash表中的key数量

   

hdel

删除指定hash表的某个键值对

   

hkeys

返回hash表中所有的key

    

hvals

返回hash表中所有的value

   

hgetall

 获取hash表中所有key和value

   

1.3. Lists

Lists 就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。

Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列。    

方法

说明

特性

lpush

在key所对应的list头部添加一个元素

l的意思是left

rpush

在key说对应的list尾部添加一个元素

r的意思是right

lrange

显示list里面的内容

lrange 0 -1 //全部显示

linsert

在key对应的list

linsert mylist before one myvalue

lset

设置list中指定下标元素的值

lset mylist index myvalue

lrem

从key对应的list中删除n个和value相同的元素,结果返回影响元素的个数,n zadd ranges 10 A_start

(integer) 1

redis 127.0.0.1:6379> zadd ranges 20 A_end

(integer) 1

redis 127.0.0.1:6379> zadd ranges 30 B_start

(integer) 1

redis 127.0.0.1:6379> zadd ranges 40 B_end

(integer) 1

这样数据在插入Sorted Sets后,相当于是将这些起始位置按顺序排列好了。

现在我需要查找15这个值在哪一个范围中,只需要进行如下的zrangbyscore查找:

redis 127.0.0.1:6379> zrangebyscore ranges (15 +inf LIMIT 0 1

1) "A_end"

这个命令的意思是在Sorted Sets中查找大于15的第一个值。(+inf在Redis中表示正无穷大,15前面的括号表示>15而非>=15)

查找的结果是A_end,由于所有值是按顺序排列的,所以可以判定15是在A_start到A_end区间上,也就是说15是在A这个范围里。至此大功告成。

当然,如果你查找到的是一个start,比如咱们用25,执行下面的命令

redis 127.0.0.1:6379> zrangebyscore ranges (25 +inf LIMIT 0 1

1) "B_start"

返回结果表明其下一个节点是一个start节点,也就是说25这个值不处在任何start和end之间,不属于任何范围。

11.存储社交关系

Sina实例

l hash sets: 关注列表, 粉丝列表, 双向关注列表(key-value(field), 排序)

l string(counter): 微博数, 粉丝数, ...(避免了select count(*) from ...)

l sort sets(自动排序): TopN, 热门微博等, 自动排序

l lists(queue): push/sub新提醒,... 

12.交集,并集,差集:(Set)

//book表存储book名称

set book:1:name    ”The Ruby Programming Language”

set book:2:name     ”Ruby on rail”

set book:3:name     ”Programming Erlang”

//tag表使用集合来存储数据,因为集合擅长求交集、并集

sadd tag:ruby 1

sadd tag:ruby 2

sadd tag:web 2

sadd tag:erlang 3

//即属于ruby又属于web的书?

 inter_list = redis.sinter("tag.web", "tag:ruby")

//即属于ruby,但不属于web的书?

 inter_list = redis.sdiff("tag.ruby", "tag:web")

//属于ruby和属于web的书的合集?

 inter_list = redis.sunion("tag.ruby", "tag:web")

5.   Redis Tools 1.8. 实用命令

l Keys * : 返回所有的key,* 可使用正则表达式查询

l Type key :返回key的类型(string ,zset ,list)

l Select 1 : 选择第一个数据库;默认0-15个数据库;默认是第0个数据库库中

l Dbsize : 当前数据库中的key的个数

l Monitor : 监控收到的请求

1.9. phpRedisAdmin

类似phpmyadmin是一个PHP的MySQL WEB管理工具,是一个PHP的Redis WEB管理工具。

图例:

 

1.10.   RedBridge: 为Redis提供HTTP API及连接池功能

RedBridge 是一款基于Redis的 HTTP API。使用LUA直接跟Redis交互,对Redis的连接实现连接池。(类似数据库的存储过程) 高效的实现复杂的业务逻辑。

特性介绍

RedBridge 具有以下特征:

1. 使用C+epoll 编写的Web Server,支持HTTP GET操作

2. 连接池,连接句柄复用,提高跟Redis连接效率

3. 部分类库使用Redis的代码,更加的稳定

4. 使用LUA直接调用Redis命令,实现一次性数据交互实现 复杂的业务逻辑。不需要多次数据交互

5. 服务模型采用单进程,双线程模式

6. 配置文件采用Lua 语法,容易读取和书写

7. RedBridge发布前,还没有类似的开源项目

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有