Redis是什么
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。Redis提供了一些丰富的数据结构,包括 lists, sets, ordered sets 以及 hashes ,当然还有和Memcached一样的 strings结构.Redis当然还包括了对这些数据结构的丰富操作。
Redis的优点
- 性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
String字符串操作
set命令:
$ redis-cli set mykey "my binary safe value" OK这样设置的值过期时间是-1,即永远不会过期的。
可以使用expire mykey 5
设置mykey的过期时间为5秒。
也可以设置过期固定时间,使用EXPIREAT命令。
expireat name 1316805000
查看是否过期或者是否存在使用exists命令。
get命令:
$ redis-cli get mykey my binary safe valueincr、incrby和decr、decrby都是原子的对数值进行增加和减少的操作:
$ redis-cli set counter 100 OK $ redis-cli incr counter (integer) 101 $ redis-cli incr counter (integer) 102 $ redis-cli incrby counter 10 (integer) 112mset批量写
$ redis-cli mset age 100 name mushui $ redis-cli get age "100"mget批量读
$ redis-cli mget age name 1) "100" 2) "mushui"append向字符串后面添加字符串:
$ redis-cli append name ' jingjing' $ redis-cli get name mushui jingjing
strlen获取字符串长度
$ redis-cli strlen name 19substr获取部分字符串
$ redis-cli substr name 0 3 mush
列表操作
列表操作,redis的列表可以看做是Java的LinkedList,双端链表的形式
lpush命令可向list的左边(头部)添加一个新元素,而rpush命令可向list的右边(尾部)添加一个新元素。最后lrange命令可从list中取出一定范围的元素。
$ redis-cli rpush messages "Hello how are you?" OK $ redis-cli rpush messages "Fine thanks. I‘m having fun with Redis" OK $ redis-cli rpush messages "I should look into this NOSQL thing ASAP" OK $ redis-cli lrange messages 0 2 1. Hello how are you? 2. Fine thanks. I‘m having fun with Redis 3. I should look into this NOSQL thing ASAP注意LRANGE 带有两个索引,一定范围的第一个和最后一个元素。这两个索引都可以为负来告知Redis从尾部开始计数,因此-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。
lpop命令从list左边弹出元素,rpop从列表右边弹出元素,实质和栈Stack类似。LLEN返回列表元素数量。
可以使用列表来实现聊天记录保存,或者保存博客的评论。
在上面的例子里 ,我们将“对象”(此例中是简单消息)直接压入Redis list,但通常不应这么做,由于对象可能被多次引用:例如在一个list中维护其时间顺序,在一个集合中保存它的类别,只要有必要,它还会出现在其他list中,等等。
例如新闻评论系统,用户提交的链接(新闻)添加到list中,有更可靠的方法如下所示:
$ redis-cli incr next.news.id (integer) 1 $ redis-cli set news:1:title "Redis is simple" OK $ redis-cli set news:1:url "http://code.google.com/p/redis" OK $ redis-cli lpush submitted.news 1 OK我们自增一个key,很容易得到一个独一无二的自增ID,然后通过此ID创建对象–为对象的每个字段设置一个key。最后将新对象的ID压入submitted.news list。
集合操作
Redis集合是未排序的集合,其元素是二进制安全的字符串。SADD命令可以向集合添加一个新元素。和sets相关的操作也有许多,比如检测某个元素是否存在,以及实现交集,并集,差集等等。
$ redis-cli sadd myset 1 (integer) 1 $ redis-cli sadd myset 2 (integer) 1 $ redis-cli sadd myset 3 (integer) 1 $ redis-cli smembers myset 1. 3 2. 1 3. 2我向集合中添加了三个元素,并让Redis返回所有元素。如你所见它们是无序的。
现在让我们检查某个元素是否存在:
$ redis-cli sismember myset 3 (integer) 1 $ redis-cli sismember myset 30 (integer) 0
“3″是这个集合的成员,而“30”不是。集合特别适合表现对象之间的关系。例如用Redis集合可以很容易实现标签功能。
下面是一个简单的方案:对每个想加标签的对象,用一个标签ID集合与之关联,并且对每个已有的标签,一组对象ID与之关联。
例如假设我们的新闻ID 1000被加了三个标签tag 1,2,5和77,就可以设置下面两个集合:
$ redis-cli sadd news:1000:tags 1 (integer) 1 $ redis-cli sadd news:1000:tags 2 (integer) 1 $ redis-cli sadd news:1000:tags 5 (integer) 1 $ redis-cli sadd news:1000:tags 77 (integer) 1 $ redis-cli sadd tag:1:objects 1000 (integer) 1 $ redis-cli sadd tag:2:objects 1000 (integer) 1 $ redis-cli sadd tag:5:objects 1000 (integer) 1 $ redis-cli sadd tag:77:objects 1000 (integer) 1要获取一个对象的所有标签,如此简单:
$ redis-cli smembers news:1000:tags 1. 5 2. 1 3. 77 4. 2
而有些看上去并不简单的操作仍然能使用相应的Redis命令轻松实现。例如我们也许想获得一份同时拥有标签1, 2, 10和27的对象列表。这可以用sinter命令来做,他可以在不同集合之间取出交集。因此为达目的我们只需:
$ redis-cli sinter tag:1:objects tag:2:objects tag:10:objects tag:27:objects ... empty list or set ... $ redis-cli sinter sinter tag:1:objects tag:2:objects tag:10:objects tag:27:objects 1) "1000"
使用sunion获取并集,sdiff获取差集。
注意:Redis集合和list都是可排序的,可以使用sort命令
redis 127.0.0.1:6379> sort news:1000:tags 1) "1" 2) "2" 3) "5" 逆序 redis 127.0.0.1:6379> sort news:1000:tags desc 1) "5" 2) "2" 3) "1"
有序集合操作
集合是使用频率很高的数据类型,但是…对许多问题来说他们也有点儿太不讲顺序了;)因此Redis1.2引入了有序集合。他和集合非常相似,也是二进制安全的字符串集合,但是这次带有关联的score,以及一个类似LRANGE的操作可以返回有序元素,此操作只能作用于有序集合,它就是,zrange 命令。
基本上有序集合从某种程度上说是SQL世界的索引在Redis中的等价物。例如在上面提到的reddit.com例子中,并没有提到如何根据用户投票和时间因素将新闻组合生成首页。我们将看到有序集合如何解决这个问题,但最好先从更简单的事情开始,阐明这个高级数据类型是如何工作的。让我们添加几个黑客,并将他们的生日作为“score”。
$ redis-cli zadd hackers 1940 "Alan Kay" (integer) 1 $ redis-cli zadd hackers 1953 "Richard Stallman" (integer) 1 $ redis-cli zadd hackers 1965 "Yukihiro Matsumoto" (integer) 1 $ redis-cli zadd hackers 1916 "Claude Shannon" (integer) 1 $ redis-cli zadd hackers 1969 "Linus Torvalds" (integer) 1 $ redis-cli zadd hackers 1912 "Alan Turing" (integer) 1
上面zadd key score value表示,向有序集合中插入key,有序集合中value值,这个值在集合中的score,即作为排序的数值。
对有序集合来说,按生日排序返回这些黑客易如反掌,因为他们已经是有序的。有序集合是通过一个dual-ported 数据结构实现的,它包含一个精简的有序列表和一个hash table,因此添加一个元素的时间复杂度是O(log(N))。这还行,但当我们需要访问有序的元素时,Redis不必再做任何事情,它已经是有序的了:
$ redis-cli zrange hackers 0 -1 1. Alan Turing 2. Claude Shannon 3. Alan Kay 4. Richard Stallman 5. Yukihiro Matsumoto 6. Linus Torvalds
你知道Linus比Yukihiro年轻吗
无论如何,我想反向对这些元素排序,这次就用 ZREVRANGE 代替 ZRANGE 吧:
$ redis-cli zrevrange hackers 0 -1 1. Linus Torvalds 2. Yukihiro Matsumoto 3. Richard Stallman 4. Alan Kay 5. Claude Shannon 6. Alan Turing
一个非常重要的小贴士,ZSets只是有一个“默认的”顺序,但你仍然可以用 SORT 命令对有序集合做不同的排序(但这次服务器要耗费CPU了)。要想得到多种排序,一种可选方案是同时将每个元素加入多个有序集合。
zscore命令获取有序集合元素的score:
$ redis-cli zscore hackers 'Richard Stallman' "1953"
有序集合之能不止于此,他能在区间上操作。例如获取所有1950年之前出生的人。我们用 ZRANGEBYSCORE 命令来做:
$ redis-cli zrangebyscore hackers -inf 1950 1. Alan Turing 2. Claude Shannon 3. Alan Kay
我们请求Redis返回score介于负无穷到1950年之间的元素(两个极值也包含了)。
也可以删除区间内的元素。例如从有序集合中删除生日介于1940到1960年之间的黑客。
$ redis-cli zremrangebyscore hackers 1940 1960 (integer) 2
ZREMRANGEBYSCORE 这个名字虽然不算好,但他却非常有用,还会返回已删除的元素数量。
Hash类型基本操作
Hash类型与Java中的HashMap类似,使用hset命令设置:
$ redis-cli hset student name mushui
设置了student元素的key-value键值对name->mushui
hget命令获取元素指定键的值。
$ redis-cli hget student name "mushui" $ redis-cli hset student age 20 $ redis-cli hset student sex '男'
hkeys获取元素的键集合,hvls获取元素的值的集合
$ redis-cli hkeys student 1) "name" 2) "age" 3) "sex"
hdel命令删除元素某个键值对。
hmset与hmget与mset和mget类似,是批设置的命令。
相关推荐
Redis是一款开源的高性能键值对数据库,它支持多种类型的数据结构,如字符串(strings)、哈希(hash)、列表(lists)、集合(sets)、有序集合(sorted sets)以及位图(bitmaps)、超日志(hyperloglogs)和地理空间索引...
Redis是一种开源的使用内存存储的数据库,它是基于键值对的数据结构服务器。在Redis中,可以使用许多命令来处理不同类型的键值对,如字符串(string)、哈希表(hash)、列表(list)、集合(set)、有序集合...
每个键都是唯一的,而每个键都与一个值相对应。这种系统非常适合于实现缓存机制。Redis、Voldemort、Dynamo、memcached、Cassandra、Hypertable等都是Key-Value存储系统的实例。 1.2 为什么选择Key-Value Store ...
Redis 5.0引入了流(Streams)数据结构,这是一种新的持久化数据类型,支持复杂的数据查询和处理。此外,还增强了主从复制功能,提供了部分同步选项,提升了系统的容错性和可用性。Redis 5.0还引入了慢日志(Slow Log)...
通过对Redis中SDS数据结构的深入分析,我们可以清晰地了解到它相对于传统C字符串的优势所在。无论是快速获取长度、确保二进制安全性,还是预防缓冲区溢出、减少内存重分配,SDS都为Redis带来了显著的性能提升。在...
- **数据结构丰富**:Redis支持多种数据结构,如字符串、列表、集合等,可以满足不同应用场景的需求。 #### 三、Redis与数据库的区别 - **Redis作为缓存**:通常用于存储那些经常被查询但很少被修改的数据,以此来...
Redis支持以下五种主要的数据类型: - **String**:最基础的数据类型,类似于Map, String>。 - **List**:有序集合,支持两端push/pop操作。 - **Set**:无序集合,不允许重复成员。 - **Sorted Set**:与Set类似,...
Redis的核心在于其高效的数据结构,如字符串(sds),哈希表(dict),链表(list),集合(set),有序集合(zset)。sds是Redis自定义的动态字符串,比C语言的原始字符串更安全、高效。dict是哈希表实现,支持...
通过这个扩展,开发者可以在PHP代码中方便地执行Redis命令,如设置和获取键值、操作列表、集合、哈希表等数据结构,以及订阅和发布消息。`php_redis.dll`的版本号、PHP版本和编译选项需要匹配,例如`...
使用php-redis扩展库,你可以享受到Redis提供的多种数据结构(如字符串、哈希、列表、集合、有序集合)以及丰富的操作命令。例如,你可以用它来进行快速的数据存储和检索,实现会话持久化,或者构建分布式锁等高级...
5. **数据导入与导出**:RDM支持将Redis数据导出为JSON、CSV等格式,同时也可以导入这些文件,方便数据迁移或备份。 6. **性能监控**:用户可以实时查看Redis服务器的性能指标,如内存使用、CPU负载、网络I/O等,有...
为了更好地利用Jedis,开发人员需要了解Redis的数据结构和命令,同时熟悉Java编程。在实际应用中,配置合理的连接池参数(如最大连接数、空闲连接数、超时时间等)也是至关重要的,这直接影响到系统的性能和稳定性。...
Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,提供了丰富的操作命令。 2. **Redis 3.2.100版本** Redis 3.2.100是该软件的一个稳定版本,发布于GitHub,针对Windows操作系统进行了优化。相较...
2. **丰富的数据结构**:除了基本的键值对存储之外,Redis还支持列表(Lists)、集合(Sets)、有序集合(Zsets)和哈希(Hashes)等多种数据结构。 3. **数据备份**:Redis支持Master-Slave架构下的数据备份机制,即数据...
它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,提供了丰富的操作命令,且数据持久化能力强,性能优秀。 **Redis Desktop Manager 0.8.8.384** 这个版本是Redis Desktop Manager的一个早期迭代,...
- **合理设计数据结构**:根据业务需求选择最适合的Redis数据结构,如使用Set替代List进行去重,使用Sorted Set实现排序等。 6. **错误处理与异常安全** - Jedis操作可能会抛出异常,如`JedisConnectionException...
- **数据结构**:Redis支持字符串、哈希、列表、集合和有序集合等多种数据类型,每种都有特定的操作方法。 - **事务**:使用`multi()`, `exec()`进行事务处理,确保一组操作的原子性。 - **发布/订阅**:`subscribe...
描述中提到,“下载安装Redis扩展包必须注意使用的PHP版本相对应”。这是因为不同的PHP版本可能需要对应的PHP Redis扩展版本。不匹配的版本可能会导致编译失败或者运行时出现错误。因此,在安装前,我们需要确保知道...
Neural Redis提供了丰富的数据结构和高效的内存管理,结合神经网络的能力,使其成为开发高性能、智能应用程序的理想选择。我们将主要关注如何在Go开发环境中设置和使用相关的数据库工具/驱动,以便有效地与Neural ...