Redis学习笔记

Redis有很多命令,下面是一些命令列表:

DECR, DECRBY, DEL, EXISTS, EXPIRE, GET, GETSET, HDEL, HEXISTS, HGET, HGETALL, HINCRBY, HKEYS, HLEN, HMGET, HMSET, HSET, HVALS, INCR, INCRBY, KEYS, LINDEX, LLEN, LPOP, LPUSH, LRANGE, LREM, LSET, LTRIM, MGET, MSET, MSETNX, MULTI, PEXPIRE, RENAME, RENAMENX, RPOP, RPOPLPUSH, RPUSH, SADD, SCARD, SDIFF, SDIFFSTORE, SET, SETEX, SETNX, SINTER, SINTERSTORE, SISMEMBER, SMEMBERS, SMOVE, SORT, SPOP, SRANDMEMBER, SREM, SUNION, SUNIONSTORE, TTL, TYPE, ZADD, ZCARD, ZCOUNT, ZINCRBY, ZRANGE, ZRANGEBYSCORE, ZRANK, ZREM, ZREMRANGEBYSCORE, ZREVRANGE, ZSCORE

我们可以使用 SET 命令存储键值对  key "server:name"   value "fido"


SET server:name "fido"


Redis将会永久的存储数据,所以我们可以问Redis"这个键server:name里面存的是啥啊?"它会回答"fido".


GET server:name  => "fido"


还有其他的一些常用命令 比如 DEL 删除一个给定的键 以及相关的 SETNX [SET-if-not-exists] 如果没有这个键才设置  还有 INCR 自动增加一个给定键的值.


SET connections 10
SETNX connections 15
INCR connections => 11
INCR connections => 12
DEL connections
INCR connections => 1


关于 INCR 这条命令有一点要说明的,为什么我们不自己用代码来实现呢,就像下面这样:

x = GET count
x = x + 1
SET count x

是的,如果在单用户下这么做是没有问题的,但是如果有两个用户同时对这个键进行访问:

Client A reads count as 10.
Client B reads count as 10.
Client A increments 10 and sets count to 11.
Client B increments 10 and sets count to 11.

事实上该键被加了2次,我们想要的结果是12,但是返回的是11.出现这种问题是因为这种操作不是原子性[atomic operation]的.而调用 INCR 命令则不会有这个问题,因为 INCR 是原子操作.Redis提供了很多这种原子操作在不同的数据类型中.

我们可以设置Redis的键的有效存在时间,通过使用EXPIRE & TTL 这两个命令.


SET resource:lock "Redis Demo"
EXPIRE resource:lock 120


设置了 EXPIRE 后 这个 resource:lock 键会在120s后被删除,你可以使用 TTL 命令查看一个键还能存留多长时间.


TTL resource:lock => 113
// after 113s
TTL resource:lock => -2


TTL 显示为 -2 也就是说  resource:lock 这个键已经不存在了.如果返回为-1 则是这个键永远不会过期,如果你设置一个键过期时间后又重新设置了该键值,那么它的TTL将会重置.

SET resource:lock "Redis Demo 1"
EXPIRE resource:lock 120
TTL resource:lock => 119
SET resource:lock "Redis Demo 2"
TTL resource:lock => -1


Redis也支持一些复杂的数据结构.下面我们要说的就是 list. list就是一系列的有序值.一些跟list交互的命令有 RPUSH, LPUSH, LLEN, LRANGE, LPOP, & RPOP.

RPUSH 把一个新的值放到list末尾.


RPUSH friends "Alice"
RPUSH friends "Bob"


LPUSH 把一个新的值放到list开头.


LPUSH friends "Sam"


LRANGE 获得list的一个子集,你可以在第一个参数里写上开始元素的索引,在第二个参数里写上最后元素的索引,如果第二个参数设为-1意思是直到list末尾.


LRANGE friends 0 -1 => 1) "Sam", 2) "Alice", 3) "Bob"
LRANGE friends 0 1 => 1) "Sam", 2) "Alice"
LRANGE friends 1 2 => 1) "Alice", 2) "Bob"

LLEN 返回当前list的长度


LLEN friends => 3

LPOP 移除list的第一个元素并返回该元素的值


LPOP friends => "Sam"

RPOP 移除list的最后一个元素并返回该元素的值


RPOP friends => "Bob"

现在list的状态呢O(∩_∩)O~

LLEN friends => 1
LRANGE friends 0 -1 => 1) "Alice"


学完了list,我们来看看另外一个数据结构->set. set跟list很像,但是它是无序的而且每个元素都不能重复,set也有一些命令:
SADD, SREM, SISMEMBER, SMEMBERS & SUNION.


SADD 给set新加一个给定值

SADD superpowers "flight"
SADD superpowers "x-ray vision"
SADD superpowers "reflexes"


SREM 从set中移除给定值的元素

SREM superpowers "reflexes"


SISMEMBER 测试给定值是否在set中 是返回1 否返回0

SISMEMBER superpowers "flight" => 1
SISMEMBER superpowers "reflexes" => 0

SMEMBERS 列出set中所有的元素

SMEMBERS superpowers => 1) "flight", 2) "x-ray vision"


SUNION 把两个或多个set合并在一起 并且返回合并后set的所有元素

SADD birdpowers "pecking"
SADD birdpowers "flight"
SUNION superpowers birdpowers => 1) "pecking", 2) "x-ray vision", 3) "flight"


set是很方便的数据类型,但是因为它是无序的所以在有些情况下表现的不是那么良好.这也是为什么Redis 1.2推出了有序set的原因.有序set跟传统的set很像,不过在有序set里每个值都有一个关联的score,就像下面这样.

ZADD hackers 1940 "Alan Kay"
ZADD hackers 1906 "Grace Hopper"
ZADD hackers 1953 "Richard Stallman"
ZADD hackers 1965 "Yukihiro Matsumoto"
ZADD hackers 1916 "Claude Shannon"
ZADD hackers 1969 "Linus Torvalds"
ZADD hackers 1957 "Sophie Wilson"
ZADD hackers 1912 "Alan Turing"


上例中,scores 就是 年份 值则是 后面的那些人名

ZRANGE hackers 2 4 => 1) "Claude Shannon", 2) "Alan Kay", 3) "Richard Stallman" [已经按照score排序]

上面我们学习了 strings, sets & sorted sets, 此外Redis也能处理Hashes.

Hashes是一个maps有一个String字段以及string值,它在展示对象类型的数据[eg: A User with a number of fields like name, surname, age, and so forth]有着不小的优势.

HSET user:1000 name "John Smith"
HSET user:1000 email "john.smith@example.com"
HSET user:1000 password "s3cret"
使用 HGETALL 保存上面的数据

HGETALL user:1000

我们也可以使用一步到位的方式

HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"
如果我们想取出刚刚设置的值

HGET user:1001 name => "Mary Jones"
HGET user:1001 email => "mjones@example.com"
如果hash类型里的字段是数字类型[Numerical values],它们跟普通字符[simple strings]的处理是相同的,如果想要增加数字类型的值,hash提供了以原子的方式实现这种操作的命令.

HSET user:1000 visits 10
HINCRBY user:1000 visits 1 => 11
HINCRBY user:1000 visits 10 => 21
HDEL user:1000 visits
HINCRBY user:1000 visits 1 => 1

Complete!
-.-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值