Redis快速入门
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快速入门的更多相关文章
- Redis快速入门:安装、配置和操作
本文是有关Redis的系列技术文章之一.在之前的文章中介绍了<Redis快速入门:初识Redis>,对Redis有了一个初步的了解.今天继续为大家介绍Redis如何安装.配置和操作. 系列 ...
- Redis 快速入门
Redis 快速入门 谈到Redis,大家应该都不陌生.它是用c语言开发的一个高性能键值数据库,主要用于缓存领域.本章通过Redis的安装,Redis的五大数据类型,Redis的Java客户端,Red ...
- Redis快速入门及实现
redis的概念 (1)Redis的优点 以下是Redis的一些优点. 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET) ...
- Redis快速入门:初识Redis
[IT168 专稿]在之前的文章中介绍了<Redis快速入门:选择Key-Value Store>,今天给大家介绍Redis的入门知识.Redis是一个开源的使用ANSI C语言编写.支持 ...
- [你必须知道的NOSQL系列]专题二:Redis快速入门
一.前言 在前一篇博文介绍了MongoDB基本操作,本来打算这篇博文继续介绍MongoDB的相关内容的,例如索引,主从备份等内容的,但是发现这些内容都可以通过官方文档都可以看到,并且都非常详细,所以这 ...
- 二:Redis快速入门及应用
Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...
- Redis快速入门及应用
Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用.一 ...
- 中小型研发团队架构实践五:Redis快速入门及应用
Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...
- 中小型研发团队架构实践:Redis快速入门及应用
Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...
- Redis快速入门详解
Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...
随机推荐
- ModernUI教程:使用预定义的页面布局
Modern UI for WPF自带了一组页面布局.Modern UI page是继承自control控件的,Page通过是通过ModernWindow.MenuLinkGroups属性来引用显示在 ...
- Bootstrap3.0学习第十六轮(进度条、媒体对象、列表组、面板)
详情请查看http://aehyok.com/Blog/Detail/23.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
- angular的canvas画图例子
angular的例子: <!DOCTYPE html> <html ng-app="APP"> <head> <meta charset= ...
- JS模式:Mixin混合模式,=_=!就是常见的Object.create()或者_extend()
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 德州扑克AI WEB版
继续之前的德州扑克话题,上次的DOS界面确实没法看,我女朋友说这是什么鬼.哈哈,估计只有自己能玩了 这两天重构了一下界面,基于web服务器和浏览器来交互. 服务器和客户端之间用websocket通信, ...
- Codeforces 650A Watchmen
传送门 time limit per test 3 seconds memory limit per test 256 megabytes input standard input output st ...
- python二维数组
和c c++不一样 过程如下: #-*- coding:utf-8 -*- t = [[ 0 for i in range(5)]for j in range(5)] for i in range(5 ...
- HTTPS-能否避免流量劫持
流量劫持是什么? EtherDream在一篇科普文章<>中详细介绍了流量劫持途径和方式. 流量劫持是一种古老的攻击方式,比如早已见惯的广告弹窗等,很多人已经对此麻木,并认为流量劫持不会造成 ...
- 基于redis分布式缓存实现
Redis的复制功能是完全建立在之前我们讨论过的基 于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你 的 ...
- 慎用 Enum.GetHashCode()
公司里遗留下了相当多的 Enum.GetHashCode()来获取枚举值的代码 但是这会产生装箱行为的!!因为Enum是值类型,GetHashCode()是Object的方法,调用GetHashCod ...