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. 12.C#yield return和yield break及实际应用小例(六章6.2-6.4)

    晚上好,各位.今天结合书中所讲和MSDN所查,聊下yield关键字,它是我们简化迭代器的关键. 如果你在语句中使用了yield关键字,则意味着它在其中出现的方法.运算符或get访问器是迭代器,通过使用 ...

  2. 第一章:javascript: 数据结构与算法

    在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门 ...

  3. AngularJS开发指南5:AngularJS表达式详解

    AngularJS表达式类似Javascript的代码片段,通常在数据绑定中用到,写在双大括号中,如:{{表达式}}.表达式是用$parse方法来处理的. 下面是一些合法的AngularJS表达式 1 ...

  4. 【转】Oracle集合操作函数:union、intersect、minus

    集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配. 集合操作符 ...

  5. 用Random类输出验证码

    package dx; import java.text.DecimalFormat; import java.util.Random; public class DxL { //创建类 public ...

  6. 【OpenJudge1814】 恼人的青蛙 暴力+剪枝优化

    此题poj1054上也有 #include<cstdio> #include<cstring> #include<algorithm> using namespac ...

  7. Java-try-catch-finally

    try-catch语句还可以包括第三部分,就是finally子句.它表示无论是否出现异常,都应当执行的内容.try-catch-finally语句的一般语法形式为: try { // 可能会发生异常的 ...

  8. Spring-事物-不依赖应用服务器的开源JTA事物实现

    不依赖应用服务器的开源JTA事物实现JOTM和Atomikos Transactions JOTM 即基于Java开放事务管理器(Java Open Transaction Manager),实现JT ...

  9. 在纯HTML的静态网页中添加一段统计网页访问量的JAVA Script代码?

    如何在网站上进行流量统计呢,可以找第三方服务网站去注册,但也可以在网站上直接添加代码,只需将以下代码copy到你的网页中,复制到</body>之前就可以啦!是不是很简单啊! <scr ...

  10. TIME_WAIT过多

    Linux系统下,TCP/IP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口.当并发请求过多的时候,就会产生大量的 TIME_WAIT状态的连接,无法及时断开的话,会占用大量的 ...