Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。一段来自百度的介绍,最重要的是,Redis很流行。

安装过程就不写了,Ubuntu版的就一句话,其它版本请自行Google。

# 启动Redis:
reidis -cli # 设置数据: set key value
127.0.0.1:6379> set name Tom
OK
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> set garde boy
OK # 获取所有键值:
127.0.0.1:6379> keys *
1) "garde"
2) "age"
3) "name" 127.0.0.1:6379> type name
string
127.0.0.1:6379> rename name Jack
OK
127.0.0.1:6379> keys *
1) "garde"
2) "Jack"
3) "age" 127.0.0.1:6379> del name age garde
(integer) 2
127.0.0.1:6379> keys *
1) "Jack"

Redis支持多种数据类型,如String、List、Set、Sorted Set、Hash等。

1.String类型

# set key value** : 设置 key 对应 String 类型的值,返回 1 表示成功,返回 0 表示失败;

127.0.0.1:6379> set key1 value1
OK # get key : 获取 key 对应的 string 值,如果 key 不存在返回 nli; 127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
(nil) # mset key1 value1 ... keyN valueN : 一次设置多个 key 的值,成功返回 1,表示所有的值都设置,失败返回 0, 表示没有任何值被设置; 127.0.0.1:6379> mset key2 value2 key3 value3 key4 value4
OK # mget key1 keyN** : 一次获取多个 key 的值,如果对应 key 不存在,则对应 key 返回 nli; 127.0.0.1:6379> mget key3 key4 key5
1) "value3"
2) "value4"
3) (nil) # incr key : 向 key 对应的值 加1, 并返回新的值。如果 key 对应的值不是 int 类型,则会返回错误,如果 key 对应的值不存在,则设置 key 的值为1; 127.0.0.1:6379> incr key1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set key1 100
OK
127.0.0.1:6379> incr key1
(integer) 101
127.0.0.1:6379> incr key5
(integer) 1 # decr key : 向 key 对应的 减1, 并返回新的值。如果 key 对应的值不是 int类型,则会返回错误,如果 key 对应的值不存在,则设置 key 的值为 -1; 127.0.0.1:6379> decr key1
(integer) 100
127.0.0.1:6379> decr key2
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decr key6
(integer) -1

优秀实践:String类型支持 incr 操作,可以用作统计计算,比如统计网站访问次数、博客访问次数等。

2.List类型


# lpush : 向 key 对应的 List 头部添加一个字符串元素,成功返回 1,失败返回 0; 127.0.0.1:6379> lpush list1 3
(integer) 1
127.0.0.1:6379> lpush list1 2
(integer) 2
127.0.0.1:6379> lpush list1 1
(integer) 3
127.0.0.1:6379> lpush list1 1
(integer) 4 # rpush : 向 key 对应的 List 尾部添加一个字符串元素,成功返回 1,失败返回 0; 127.0.0.1:6379> rpush list1 4
(integer) 5
127.0.0.1:6379> rpush list1 5
(integer) 6
127.0.0.1:6379> rpush list1 6
(integer) 7 # llen key : 返回 key 对应 List 长度,如果 key 不存在返回 0, 如果 Key 对应类型不是 List 返回错误; 127.0.0.1:6379> llen list1
(integer) 7
127.0.0.1:6379> llen nothing
(integer) 0 # lrange key start end : 返回指定区间内(start - end)的元素,下标从0开始,负值表示从链表尾部开始计算,-1表示倒数第一个元素,key 不存在返回空列表; 127.0.0.1:6379> lrange list1 2 4
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> lrange list1 -3 -1
1) "4"
2) "5"
3) "6"
127.0.0.1:6379> lrange list1 100 200
(empty list or set) # lpop : 从 List 头部删除并返回删除元素。如果 key 对应 List 不存在或者为空返回 nil,如果 key 对应值不是 List 返回错误; 127.0.0.1:6379> lpop list1
"1"
127.0.0.1:6379> lpop list1
"1"
127.0.0.1:6379> lpop list1
"2"
127.0.0.1:6379> lpop nothing
(nil)
127.0.0.1:6379> lpop key1
(error) WRONGTYPE Operation against a key holding the wrong kind of value # rpop : 从 List 尾部删除并返回删除元素。其他规则同 lpop; 127.0.0.1:6379> rpop list1
"6"
127.0.0.1:6379> rpop list1
"5"
127.0.0.1:6379> rpop list1
"4"
127.0.0.1:6379> rpop list1
"3"
127.0.0.1:6379> rpop list1
(nil)

优秀实践:采用 List 可以实现定时计划任务队列功能,减轻数据库压力。新的计划任务使用 rpush 放入队列尾部,然后使用 lpop 将队列头部任务取出执行。

3.Set 类型

# sadd key member : 添加一个 String 元素到 key 对应的 Set 集合中,成功返回1,如果元素已经存在集合中,返回0, key 对应的 Set 不存在返回错误;

127.0.0.1:6379> sadd set1 Tom
(integer) 1
127.0.0.1:6379> sadd set1 Jack
(integer) 1
127.0.0.1:6379> sadd set1 Marry
(integer) 1
127.0.0.1:6379> sadd set1 Lcy
(integer) 1
127.0.0.1:6379> sadd set1 Lcy
(integer) 0 # srem key member : 从 key 对应的 Set 中移除给定元素,成功返回1,如果 member 在集合中不存在或者 key 不存在返回0,如果 key 对应的不是 Set 类型返回错误; 127.0.0.1:6379> srem set1 Lcy
(integer) 1
127.0.0.1:6379> srem set1 nothing
(integer) 0 # spop key : 删除并返回 key 对应 Set 中的一个随机元素,如果 Set 为空或者 key 对应的 Set 不存在返回 cli 127.0.0.1:6379> spop set1
"Jack"
127.0.0.1:6379> spop set1
"Tom"
127.0.0.1:6379> spop set2
(nil) #scard key : 返回 Set 的元素个数,如果 Set 为空或者 key 不存在返回0; 127.0.0.1:6379> scard set1
(integer) 1
127.0.0.1:6379> scard nothing
(integer) 0 # sismember key member : 判断 member 是否存在于 key 中,存在返回1,不存在或者 key 对应的 Set 集合不存在返回0; 127.0.0.1:6379> sismember set1 Jack
(integer) 0
127.0.0.1:6379> sismember set1 Marry
(integer) 1
127.0.0.1:6379> sismember set1 Tom
(integer) 0 # sinter key1 key2 keyN : 返回所有给定 key 的交集; # 集合1
127.0.0.1:6379> sadd set1 C
(integer) 1
127.0.0.1:6379> sadd set1 Java
(integer) 1
127.0.0.1:6379> sadd set1 PHP
(integer) 1 # 集合2
127.0.0.1:6379> sadd set2 PHP
(integer) 1
127.0.0.1:6379> sadd set2 Java
(integer) 1
127.0.0.1:6379> sadd set2 C++
(integer) 1 # 集合3
127.0.0.1:6379> sadd set3 Python
(integer) 1
127.0.0.1:6379> sadd set3 PHP
(integer) 1
127.0.0.1:6379> sadd set3 Java
(integer) 1 127.0.0.1:6379> sinter set1 set2 set3
1) "PHP"
2) "Java" # smembers key : 返回 key 对应 Set 的所有元素,结果是无序的; 127.0.0.1:6379> smembers set1
1) "PHP"
2) "C"
3) "Java" 127.0.0.1:6379> smembers set2
1) "PHP"
2) "C++"
3) "Java" 127.0.0.1:6379> smembers set3
1) "PHP"
2) "Python"
3) "Java"

优秀实践:Set 数据类型的有点是快速查找元素是否存在,用于记录一些不能重复的数据。例如在某些投票系统中,每个用户一天只能投票一次,那么可以使用 Set 来记录某个用户的投票情况,只需要以日期作为 Set 的 key,将用户ID作为 member,以日期作为 key 去查询用户ID是否存在即可。

4.Sorted Set类型

# zadd key score member : 添加元素 member 到集合,元素在集合中存在则更新对应 score;

127.0.0.1:6379> zadd sort_set1 1 one
(integer) 1
127.0.0.1:6379> zadd sort_set1 2 two
(integer) 1
127.0.0.1:6379> zadd sort_set1 100 one
(integer) 0
127.0.0.1:6379> zadd sort_set1 3 three
(integer) 1 # zrem key member : 删除指定元素,1表示成功,如果元素不存在返回0; 127.0.0.1:6379> zrem sort_set1 three
(integer) 1
127.0.0.1:6379> zrem sort_set1 nothing
(integer) 0 # zincrby key incr member : 增加对应 member 的 score 值,并且重新排序,返回更新后的 score 值; 127.0.0.1:6379> zincrby sort_set1 101 one
"201" # zcard key : 返回集合中元素个数; 127.0.0.1:6379> zcard sort_set1
(integer) 2 # zscore key element : 返回给定元素对应的 score;
127.0.0.1:6379> zscore sort_set1 one
"201"
127.0.0.1:6379> zscore sort_set1 two
"2"

优秀实践:Sorted Set 类型在 Web 应用中非常有用。例如问答系统中按 “赞同数” 排序,将 “赞同字段” 设置为 Sorted Set 的 member 值,将具体的赞同数量数据设置为对应的 score,用户每次按 “赞同” 时,只需要执行 zincrby 命令增加赞同数量即可;

5.Hash类型

# hset key field value : 设置 key 对应的 Hash 对象中指定域的值。如果 key 对应的 Hash 对象不存在,将创建此 Hash 对象。如果指定的域已经存在,其值将被重写;

127.0.0.1:6379> hset hash_person name 游梦惊园
(integer) 1
127.0.0.1:6379> hset hash_person blog www.codean.net
(integer) 1 # hget key field : 返回与 field 域关联的值,如果该域不存在或者 key 对应的 Hash 对象不存在,返回值为 cli; 127.0.0.1:6379> hget hash_person blog
"http://www.cnblogs.com/duanbiaowu"
127.0.0.1:6379> hget hash_person age
(nil)
127.0.0.1:6379> hget hash_nothing blog
(nil) # hmset key field1 value1 fieldN valueN : 设置存储在 key 对应的 Hash 对象中指定域的值。该命令会复写 Hash 中已经存在的域。如果 key 对应的 Hash 对象不存在,将创建此 Hash 对象; 127.0.0.1:6379> hmset hash_person name 游梦惊园2 gender man
OK # hmget key field1 field2 fieldN : 返回存储在 key 对应的 Hash 对象中各个指定域相关联的值。对应在 Hash 对象中不存在的域,返回值为 cli; 127.0.0.1:6379> hmset hash_person name 游梦惊园2 gender man
OK
127.0.0.1:6379> hmget hash_person name blog age gender
1) "\xe6\xb8\xb8\xe6\xa2\xa6\xe6\x83\x8a\xe5\x9b\xad2"
2) "www.codean.net"
3) (nil)
4) "man" # hexists key field : 查看指定 field 域是否已经存在; 127.0.0.1:6379> hexists hash_person name
(integer) 1
127.0.0.1:6379> hexists hash_person age
(integer) 0 # hlen key : 返回 key 对应的 Hash 对象中 field 数,如果 key 不存在,返回值为0; 127.0.0.1:6379> hlen hash_person
(integer) 3
127.0.0.1:6379> hlen hash_person2
(integer) 0 # hkeys key : 返回 key 对应的 Hash 对象中所有 field 名称; 127.0.0.1:6379> hkeys hash_person
1) "name"
2) "blog"
3) "gender" # hvals key : 返回 key 对应的 Hash 对象中所有值;
127.0.0.1:6379> hvals hash_person
1) "\xe6\xb8\xb8\xe6\xa2\xa6\xe6\x83\x8a\xe5\x9b\xad2"
2) "www.codean.net"
3) "man"

优秀实践:Hash类型适合存储对象,例如用户信息,将用户ID作为 key,用户信息保存到 Hash 类型中。

参考书籍:PHP核心技术与最佳实践

Redis快速入门的更多相关文章

  1. Redis快速入门:安装、配置和操作

    本文是有关Redis的系列技术文章之一.在之前的文章中介绍了<Redis快速入门:初识Redis>,对Redis有了一个初步的了解.今天继续为大家介绍Redis如何安装.配置和操作. 系列 ...

  2. Redis 快速入门

    Redis 快速入门 谈到Redis,大家应该都不陌生.它是用c语言开发的一个高性能键值数据库,主要用于缓存领域.本章通过Redis的安装,Redis的五大数据类型,Redis的Java客户端,Red ...

  3. Redis快速入门及实现

    redis的概念 (1)Redis的优点 以下是Redis的一些优点. 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET) ...

  4. Redis快速入门:初识Redis

    [IT168 专稿]在之前的文章中介绍了<Redis快速入门:选择Key-Value Store>,今天给大家介绍Redis的入门知识.Redis是一个开源的使用ANSI C语言编写.支持 ...

  5. [你必须知道的NOSQL系列]专题二:Redis快速入门

    一.前言 在前一篇博文介绍了MongoDB基本操作,本来打算这篇博文继续介绍MongoDB的相关内容的,例如索引,主从备份等内容的,但是发现这些内容都可以通过官方文档都可以看到,并且都非常详细,所以这 ...

  6. 二:Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...

  7. Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用.一 ...

  8. 中小型研发团队架构实践五:Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...

  9. 中小型研发团队架构实践:Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...

  10. Redis快速入门详解

    Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...

随机推荐

  1. css为什么要用悬浮

    如果这个100px的宽度是一个Img,横内元素.右边也是横内元素的话和块级元素是不同的. 2.文字环绕图片. div下有个img然后有个span标签 img最好悬浮,悬浮虽然说脱离文档,但是还是占空间 ...

  2. Linq之常见关键字

    目录 写在前面 系列文章 常见关键字 总结 写在前面 前面的几篇文章算是对linq的铺垫,从本篇开始将进行linq的语法及实践. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda ...

  3. javascript继承(四)—prototype属性介绍

    js里每一个function都有一个prototype属性,而每一个实例都有constructor属性,并且每一个function的prototype都有一个constructor属性,这个属性会指向 ...

  4. NABCD——竞争性需求分析的框架

    最近在读邹欣老师的书<构建之法>,读到很多地方,相当有感触,有种一拍大腿“啊,他说的太对了”的感觉,但都疏于记录,今天又看到一个一拍大腿特带感的一节,决定记录下来. 竞争性需求分析的框架— ...

  5. Struts2 数据校验流程

  6. 更新java对xml文件的操作

    //更新java在xml文件中操作的内容 public static void upda(Document doc) throws Exception{ //创建一个TransformerFactor ...

  7. MVC学习Day02之校验

    MVC校验有两种方法: 方法一:自己动手写js---------略 方法二: l在View的页面中,首先指定页面强类型@model 类型 l使用Html.***For(model=>model. ...

  8. xml_MathML的基本知识点__这东西要自己实践最好

    1 : <mi> 一般的字符串 2: <mo> 操作字符串 <mo> ( </mo> <mo>∑</mo> 3:<mn&g ...

  9. 【POJ 2484】A Funny Game

    Description Alice and Bob decide to play a funny game. At the beginning of the game they pick n(1 &l ...

  10. RHCS

    简介 Red Hat Cluster Suite :红帽子集群套件 高可用性.高可靠性.负载均衡.存储共享 高可用集群是 RHCS 的核心功能.当应用程序出现故障,或者系统硬件. 网络出现故障时,应用 ...