Redis基本使用分享

Redis介绍

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, SetsOrdered Sets 数据类型操作。

原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Keys

Redis中key的命名(非硬性规定)

a:b:c # 中间用冒号隔开

Key删除

> set demo_key 123_value
> get demo_key
"123_value"
> del demo_key # 删除一个key
(integer) 1
> del key1 key2 key3 key4 #删除多个key
(integer) 4

Key pattern

查找符合给定模式的key

KEYS *命中数据库中所有key。

KEYS h?llo命中hello, hallo and hxllo等。

KEYS h*llo命中hllo和heeeeello等。

KEYS h[ae]llo命中hello和hallo,但不命中hillo。

特殊符号用""隔开

> set user:1000 1000
> set user:2000 2000
> set user:3000 3000
> keys user:*
1) "user:1000"
2) "user:2000"
3) "user:3000"

Redis数据类型

Strings

字符串类型的Value最多可以容纳的数据长度是512M

String
> set mykey somevalue
OK
> get mykey
"somevalue"

原子递增(decr递减)

> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

Lists

List类型是按照插入顺序排序的字符串链表。List中可以包含的最大元素数量是4294967295。可以出现重复数据

List
> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
> rpush mylist a b c
(integer) 3
> rpop mylist
"c"
> rpop mylist
"b"
> rpop mylist
"a"

Hashes

Hashes类型的value是一个k-v容器

Hash
> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hget user:1000 username
"antirez"
> hget user:1000 birthyear
"1977"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"

删除value里面的字段或者增加字段

> hdel user:1000 verified  # 删除value里面的字段
1
> hkeys user:1000
1)username
2)birthyear
> hsetnx user:1000 status 1 # 给value添加字段并赋值
> hkeys user:1000
1)username
2)birthyear
3)status

Sets

Set类型是无序的字符集合,不允许出现重复元素

Set
> sadd myset 1 2 3
(integer) 3
> smembers myset
1) 3
2) 1
3) 2

Ordered Sets(zset、Sorted-Sets)

Sorted-Sets类似Sets,主要差别Sorted-Sets能够排序(每一个成员都会有一个score)

ZSet
> zadd hackers 1940 "Alan Kay"
(integer) 1
> zadd hackers 1957 "Sophie Wilson"
(integer 1)
> zadd hackers 1953 "Richard Stallman"
(integer) 1
> zadd hackers 1949 "Anita Borg"
(integer) 1
> zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
> zadd hackers 1914 "Hedy Lamarr"
(integer) 1
> zadd hackers 1916 "Claude Shannon"
(integer) 1
> zadd hackers 1969 "Linus Torvalds"
(integer) 1
> zadd hackers 1912 "Alan Turing"
(integer) 1
> zrange hackers 0 -1
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"
6) "Richard Stallman"
7) "Sophie Wilson"
8) "Yukihiro Matsumoto"
9) "Linus Torvalds"

Redis超时(设置key的过期时间)

设置key的过期时间

> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)

通过PERSIST命令取消深知key的过期时间

> set hello 123
OK
> expire hello 10
(integer) 1
> persist hello
(integer) 1

通过TTL命令查看key的剩余过期时间

> set key 100 ex 10
OK
> ttl key
(integer) 9

Sort

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

返回或保存给定列表、集合、有序集合key中经过排序的元素。

# 将数据一一加入到列表中

redis> LPUSH today_cost 30
(integer) 1

redis> LPUSH today_cost 1.5
(integer) 2

redis> LPUSH today_cost 10
(integer) 3

redis> LPUSH today_cost 8
(integer) 4

# 排序

redis> SORT today_cost
1) "1.5"
2) "8"
3) "10"
4) "30"

> sort today_cost limit 0 2 desc
1) "30"
2) "10"

Redis 事务

和mysql的事务有很大的区别。Redis事务相当于批量提交,出错没有回滚。

redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET tutorial redis
QUEUED
redis 127.0.0.1:6379> GET tutorial
QUEUED
redis 127.0.0.1:6379> INCR visitors
QUEUED
redis 127.0.0.1:6379> EXEC

1) OK
2) "redis"
3) (integer) 1

MULTI 开启事务

EXEC 执行事务

DISCARD 取消事务

WATCH 可以为 Redis 事务提供 check-and-set (CAS)行为。

Ruby Gem

redis-rb

  1. wiki: http://inch-ci.org/github/redis/redis-rb

    A Ruby client library for Redis

  2. 使用

$redis = Redis.new(:host => "10.0.1.1", :port => 6380, :db => 15)
$redis.set("mykey", "hello world")
$redis.get("mykey")

方法名同redis-cli命令名相同

redis-objects

  1. 介绍

A Ruby client library for Redis

对reids的封装,调用更符合Ruby的命名规范,并且可以在model中使用.

  1. 使用
class Team < ActiveRecord::Base
      include Redis::Objects

      lock :trade_players, :expiration => 15  # sec
      value :at_bat
      counter :hits
      counter :runs
      counter :outs
      counter :inning, :start => 1
      list :on_base
      list :coaches, :marshal => true
      set  :outfielders
      hash_key :pitchers_faced  # "hash" is taken by Ruby
  sorted_set :rank, :global => true
end
@team = Team.find_by_name('New York Yankees')
@team.on_base << 'player1'
@team.on_base << 'player2'
@team.on_base << 'player3'
@team.on_base    # ['player1', 'player2', 'player3']
@team.on_base.pop
@team.on_base.shift
@team.on_base.length  # 1
@team.on_base.delete('player2')
  1. 生成的Redis key的格式为:

    model_name:id:field_name

redis-namespace

This gem adds a Redis::Namespace class which can be used to namespace Redis keys. http://redis.io

为 redis key 添加命名空间

使用
redis = Redis.new(host: redis_config['host'], port: redis_config['port'], password: redis_config['password'])
$redis = Redis::Namespace.new(redis_config['namespace'], redis: redis)

使用redis-namespace后生成的key的值:namespace:model_name:id:field_name

redis-rb、redis-object、redis-namespace

redis.yml

defaults: &defaults
  host: 127.0.0.1
  port: 6379
  namespace: qdaily4
  password: qdaily
development:
  <<: *defaults
test:
  <<: *defaults
production:
  <<: *defaults

redis.rb 文件

require 'redis'
require 'redis-namespace'
require 'redis/objects'

redis_config = YAML.load_file("#{Rails.root}/config/redis.yml")[Rails.env]

redis = Redis.new(host: redis_config['host'], port: redis_config['port'], password: redis_config['password'])
$redis = Redis::Namespace.new(redis_config['namespace'], redis: redis)
Redis::Objects.redis = $redis

其它Redis Client for Ruby客户端

推荐

Medis: Mac下Redis管理工具
Download

Medis

Medis

参考资料

  1. Redis资料汇总专题 http://blog.nosqlfan.com/html/3537.html
  2. Redis系统性介绍 http://blog.nosqlfan.com/html/3139.html
  3. Redis学习手册(String数据类型)http://www.cnblogs.com/stephen-liu74/archive/2012/03/14/2349815.html
  4. Redis学习手册(Hashes数据类型)http://www.cnblogs.com/stephen-liu74/archive/2012/03/19/2352932.html
  5. Redis学习手册(List数据类型)http://www.cnblogs.com/stephen-liu74/archive/2012/02/14/2351859.html
  6. Redis学习手册(Set数据类型)http://www.cnblogs.com/stephen-liu74/archive/2012/03/21/2352512.html
  7. Redis学习手册(Sorted-Sets数据类型)http://www.cnblogs.com/stephen-liu74/archive/2012/03/23/2354994.html
  8. Reids设计与实现http://redisbook.com/
  9. 哈希对象http://redisbook.com/preview/object/hash.html

提高

  1. 主从复制http://www.cnblogs.com/stephen-liu74/archive/2012/03/30/2364717.html
  2. 事务队列http://www.cnblogs.com/stephen-liu74/archive/2012/03/28/2357783.html
  3. redis远程调用http://blog.fens.me/linux-redis-install/
  4. 事务http://redisbook.readthedocs.org/en/latest/feature/transaction.html
  5. 国内外三个不同领域巨头分享的Redis实战经验及使用场景
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • Redis杂谈 Redis是近年来发展迅速的内存数据库,网上也已经有多Redis的文章。但不管是英文还是中文,多数...
    迷失于重逢阅读 1,531评论 0 14
  • 5/15/2017 7:06:35 PM 纵观各大组件,配置文件占据极其重要的地位。可配置化也是当下开发的一流行趋...
    爱做梦的胖子阅读 4,412评论 0 8
  • 前几天,我看到网络上流传的一篇文章,叫《健身和不健身的女人差别有多大?》。作者找了一些对比图,身材苗条紧实和体...
    Lily向丽阅读 1,925评论 0 0
  • 今天是很奇妙的一天,可以说是遇到了一位知心朋友吧,可以把自己的心思说出来一点顾忌都没有,这是一件值得庆幸的事情,因...
    A羽翼阅读 191评论 0 0