点滴记录——学习Redis笔记

转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701409

Redis 默认端口6379

Redis适用场景

1. 取最新N个数据的操作

2. 排行榜应用,取TOP N操作

3. 需要精确设定过期时间的应用

4. 计数器应用

5. Uniq操作,获取某段时间所有数据排重值

6. 实时系统,反垃圾系统

7. Pub/Sub构建实时消息系统——消息的发布与订阅

8. 构建队列系统

9. 缓存

Redis数据类型

Strings类型及操作

String是最简单的类型。一个Key对应一个Value,String类型是二进制安全的。Redis的String可以包含任何数据,比如jpg图片或者序列化的对象。

set  key value

get key

setex key time_seconds value  设置key对应的值为String类型的value,并指定此键值的有效期

setnx key value 如果key不存在才设置value,否则返回0

setrange key offset replace_value 设置指定key的value值的子字符串,成功返回替换后的字符串总长度,如果原先的key不存在,则创建,返回offset+strlen(replace_value),其具有替换功能

set email [email protected]

setrange email 7 sina  //从email的第8(从1开始)个字符开始替换成sina

get email

[email protected]sinaapp.com

get em

(nil)

setrange em 3 aaa

(integer) 6

get em

"\x00\x00\x00aaa"

mset key1 value1 key2 value2 ... 设置多个key,成功返回ok,失败返回0,所有值都不会成功

msetnx 一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已存在的key。(只要有一个没成功,其他的也不会成功)

msetnx key1 value1 kye2 value2 ...

getset key new_value   获取旧值时使用新值替换旧值,如果key不存在,则返回nil,并设置key的值为new_value

getrange key offset_begin offset_end  获取一个key的指定返回字符串

getrange email 3 5

"ric"

mget key1 kye2 kye3 ...  获取多个key值,不存在的key返回(nil)

decr key   对key减一  key--

decrby key value  对key做 key -= value

incr key 对key的值做加1操作,并返回新的值,如果key不存在则创建一个并赋值为0,因此incr后变成1

incrby key value   对key的值加value

incrby k 5

(integer) 5

incrby k -3

(integer) 2

get k

"2"

append key value  对key追加value,返回追加后key值的总长度,如果key不存在则创建

append k .com

(integer) 5

get k

"2.com"

  hashes类型及操作

Redis hash是一个String类型的field和value的映射表。它的添加、删除操作都是O(1)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个String类型。将一个对象存储在hash类型中会占用更少的内存,并且可以方便的存取整个对象。

hset hashtable_name field_key value 设置hash field为指定值,如果field_key不存在则先创建

hget hashtable_name field_key

hsetnx hashtable_name field_key value 设置hash field为指定值,如果field_key不存在,则先创建。如果存在则返回0

hmset hashtable_name field_key1 value1 field_key2 value2 ...

hmget hashtable_name field_key1 field_key2

hincrby  hashtable_name field_key value  对hash表中的字段field_key 加上value

hexists hashtable_name field_key   判断hash表中的字段field_key是否存在  存在返回1,否则返回0

hdel hashtable_name field_key  删除hash表中的字段field_key删除

hkeys hashtable_name  返回hashtable_name中的全部field_key

hvals hashtable_name 返回hashtable_name中的value值

hgetall hashtable_name 同时返回所有的字段和内容

lists类型及操作

list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是String类型的双向链表。我们可以通过push、pop操作链表的头部或者尾部添加删除元素,这样list可以作为栈,又可以作为队列。

lpush list_name_key value  在list_name_key对应list头部添加字符串元素  可以同时插入多个

rpush list_name_key value  从尾部插入  可以同时插入多个

linsert list_name_key before/after value1 value2  在value1前/后插入value2

lrange list_name_key  0 -1  列取list_name_key对应的list的所有值,0代表头,-1代表尾

lset list_name_key i value  将下标为i(i从0开始)的内容替换成value

127.0.0.1:6379> lrange list_0 0 -1

1) "three"

2) "two"

3) "one"

127.0.0.1:6379> lset list_0 1 four

OK

127.0.0.1:6379> lrange list_0 0 -1

1) "three"

2) "four"

3) "one"

lrem list_name_key count value  从链表中删除count个与value相同的值

127.0.0.1:6379> lrange list_0 0 -1

1) "one"

2) "one"

3) "one"

4) "one"

5) "three"

6) "four"

7) "one"

127.0.0.1:6379> lrem list_0 3 "one"

(integer) 3

127.0.0.1:6379> lrange list_0 0 -1

1) "one"

2) "three"

3) "four"

4) "one"

127.0.0.1:6379> lrange list_0 0 -1

1) "three"

2) "four"

3) "one"

ltrim list_name_key begin end  保留从begin到end之间的数值,其他的全部删除

127.0.0.1:6379> lrange list_0 0 -1

1) "one"

2) "one"

3) "one"

4) "three"

5) "four"

6) "one"

127.0.0.1:6379> ltrim list_0 4 5

OK

127.0.0.1:6379> lrange list_0 0 -1

1) "four"

2) "one"

lpop list_name_key  从头部弹出一个元素

127.0.0.1:6379> lrange list_0 0 -1

1) "four"

2) "one"

127.0.0.1:6379> lpop list_0

"four"

127.0.0.1:6379> lrange list_0 0 -1

1) "one"

rpop list_name_key 从尾部弹出一个元素

rpoplpush list_name_key1 list_name_ley2 从第一个list的尾部移除一个元素并添加到第二个list的头部

lindex list_name_key index  返回名称为list_name_key的list中index位置的元素

127.0.0.1:6379> lrange list_0 0 -1

1) "ten"

2) "three"

3) "two"

127.0.0.1:6379> lindex list_0 2

"two"

llen  list_name_key 返回对应list中的长度

sets类型及操作

set是集合,它是string类型的无序集合。set是通过hash table实现的添加、删除、和查找的复杂度都是O(1)。对集合我们可以取并集、交集、差集。通过这些操作我们可以实现sns中的好友推荐和blog的tag功能。

sadd set_name value  向set_name集合中添加value,集合中不允许有相同的value,插入相同的值时会返回0,表示失败

srem set_name value  将set_name集合中的value删除,删除成功返回1,失败返回0,如果不存在也返回0

spop set_name  在set_name集合中随机弹出一个元素并删除该元素

smembers set_name  列取set_name集合中的所有元素

sdiff set_name_1 set_name_2  计算两个集合的差集

127.0.0.1:6379> smembers s1

1) "a"

2) "c"

3) "b"

127.0.0.1:6379> smembers s2

1) "d"

2) "c"

127.0.0.1:6379> sdiff s1 s2

1) "a"

2) "b"

127.0.0.1:6379> sdiff s2 s1

1) "d"

sdiffstore set_name_1 set_name_2 set_name_3  取set_name_2和set_name_3差集并将结果存入set_name_1中,

如果set_name_1已经存在,其原始数据将会被删除

127.0.0.1:6379> sdiffstore s3 s1 s2

(integer) 2

127.0.0.1:6379> smembers s3

1) "a"

2) "b"

sinter set_name_1 set_name_2  获取交集

sinterstore set_name_3 set_name_1 set_name_2  获取set_name_1和set_name_2的交集并存于set_name_3中

sunion set_name_1 set_name_2  获取并集

sunionstore set_name_3 set_name_1 set_name_2  获取set_name_1和set_name_2的并集存于set_name_3中

smove set_name_1 set_name_2 value  将set_name_1中的value元素移动到set_name_2中,注意,如果value在set_name_2中已存在,则不会被插入,但是set_name_1中的value将会被移除

scard set_name  返回set_name集合中的元素个数

sismember set_name value  判断value是否为set_name集合的元素,返回1代表是,0代表不是

srandmember set_name   随机返回set_name集合的一个元素,但不删除

sorted sets类型及操作

sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存储value,一列存储序列。操作中key理解为zset的名字。

zadd set_name sequence_number value   往顺序集合中添加value,并添加顺序号sequence_number,如果value在集合中已存在,则会添加失败,但是会更新原来value的顺序号为后来更新的顺序号

127.0.0.1:6379> zadd zs1 1 one

(integer) 1

127.0.0.1:6379> zadd zs1 2 two

(integer) 1

127.0.0.1:6379> zadd zs1 3 two

(integer) 0

127.0.0.1:6379> zadd zs1 4 four

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "3"

5) "four"

6) "4"

zrange set_name begin end   获取有序集合中下标begin~end范围内的元素,如果end==-1则代表到集合末尾

zrange set_name begin end withscores   将sequence_number一起返回

127.0.0.1:6379> zrange zs1 0 -1

1) "one"

2) "two"

3) "four"

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "3"

5) "four"

6) "4"

zrem set_name value  删除集合中元素值为value的元素,成功返回1,失败返回0

zincrby set_name n value  将集合中value所对应的序列号增加n

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "two"

2) "3"

3) "four"

4) "4"

127.0.0.1:6379> zincrby zs1 2 two

"5"

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "four"

2) "4"

3) "two"

4) "5"

zrank set_name  value 返回集合set_name中按member元素的排名后(按score从小到大排序)value元素的下标(下标从1开始)

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "one"

2) "1"

3) "four"

4) "4"

5) "two"

6) "5"

127.0.0.1:6379> zrank zs1 two

(integer) 2

zrevrange set_name begin end withscores   按降序排序列取begin~end间的元素

127.0.0.1:6379> zrevrange zs1 0 -1 withscores

1) "two"

2) "5"

3) "four"

4) "4"

5) "one"

6) "1"

zrangebyscore set_name begin end withscores   返回顺序号从begin到end的元素返回

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "one"

2) "1"

3) "three"

4) "2"

5) "five"

6) "3"

7) "four"

8) "4"

9) "two"

10) "5"

127.0.0.1:6379> zrangebyscore zs1 2 4 withscores

1) "three"

2) "2"

3) "five"

4) "3"

5) "four"

6) "4"

zcount set_name begin end   返回集合中顺序号begin~end元素的个数

127.0.0.1:6379> zcount zs1 2 4

(integer) 3

zcard set_name   返回集合中的所有元素个数

127.0.0.1:6379> zcard zs1

(integer) 5

zremrangebyrank set_name begin end   将索引(从0开始)区间为begin~end的元素删除

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "one"

2) "1"

3) "three"

4) "2"

5) "five"

6) "3"

7) "four"

8) "4"

9) "two"

10) "5"

127.0.0.1:6379> zremrangebyrank zs1 1 3

(integer) 3

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "5"

zremrangebyscore set_name begin end    按顺序号从begin~end的元素删除

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "5"

127.0.0.1:6379> zremrangebyscore zs1 1 3

(integer) 1

127.0.0.1:6379> zrange zs1 0 -1 withscores

1) "two"

2) "5"

Redis常用命令

Redis提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以在Linux终端使用

1. 键值相关命令

2. 服务器相关命令

 Redis默认有0~15共16个数据库,使用select命令来进入不同的数据库,默认进入0数据库,select 1表示进入1数据库

1. 键值相关命令

keys *   表示取出所有的key,类似模糊匹配,可在前或者在后添加多个字符

exists key  用于判断对应的key是否存在,存在返回1,否则返回0

del key  删除key,如果key不存在则返回0表示失败  同时可以删除多个

expire key seconds  对已存在的key设置过期时间为seconds秒

ttl key  获取key还剩多长时间过期,如果返回-2则表示已过期

move key database_number   将key从当前数据库移动到database_number数据库中

persist key 移除key的过期时间,让其不过期,此时使用ttl命令查看则返回-1,表示取消了过期时间

randomkey key  随机返回一个当前数据库中的一个key

rename key new_key  重命名key为new_key

type key  返回key所属的数据类型

 2.服务器相关命令

ping  检查当前连接是否正常,正常返回PONG

echo test   输出test与linux shell的echo一样

select  n  Redis数据库编号从0~15,我们可以任意选择一个数据库进行数据存取

quit   退出当前连接

dbsize   返回当前数据库中key的总数目

info    获取Redis服务器的相关信息

config get   实时转储收到的请求

config get * 获取所有

flushdb   删除当前数据库中的所有库

flushall   删除所有数据库中的所有key(谨慎使用)

Redis高级实用特性

1. 安全性

设置客户端连接后进行任何其他操作前需要实用的密码

警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。

修改配置文件redis.conf

requirepass cynric           #cynric即为密码,可以使用redis-cli -a cynric指定密码登陆,也可以登陆后通过auth cynric来授权

2. 主从复制

Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。其特点有:(1)master可以拥有多个slave  (2)多个slave可以连接同一个master,还可以连接到其它slave  (3)主从复制不会阻塞master,在同步数据时,master可以继续处理client请求。(4)提高系统的伸缩性

配置主从服务器,修改配置文件slaveof ip port 如果主机配置了密码则需要配置masterauth passwd

查看当前Redis主机是master还是slave可以通过info命令查看

3. 事务处理

Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,Redis会顺序的执行队列中的所有命令。在还没有执行exec之前可以通过discard命令取消还未执行的事务。如果事务中的某个命令执行出错,则事务不会回滚,已经正确执行的命令不会回滚。

multi  可用于打开事务上下文

4. 乐观锁复杂事务控制

大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是为数据库表添加一个"version"字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交的版本号与数据库表对应记录的当前版本号进行对比,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。

watch命令会监视给定的key,当exec时,如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。exec,discard,unwatch命令都会清除连接中的所有监视。

watch key  用于监视key的变化

 5.持久化机制

Redis是一个支持持久化的内存数据库,就是说Redis需要经常将内存中的数据同步到硬盘来保证持久化。

Redis支持两种持久方式:

1. Snapshotting方式即快照方式

该方式是默认的持久化方式。这种方式是将内存中数据以快照的方式写入二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。

save 900 1   #900秒内如果超过1个key被修改,则发起快照保存

save 300 10  #300秒内如果超过10个key被修改,则发起快照保存

2. aof方式(Append-Only File)

由于快照方式是在一定间隔时间做一次的,所以如果Redis意外down掉的话,就会丢失最后一次快照的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,Redis会将每一个收到的写命令都通过write函数追加到文件中,当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于操作系统会在内核中缓存write做的修改,所以可能不是立即写到磁盘上,这样aof方式的持久化也还是有可能丢失部分数据。可以通过配置文件告诉Redis通过fsync函数强制写入到磁盘的时机。

appendonly yes   #启用aof持久化方式,默认为no

appendfsync always  #收到写命令就立即写入磁盘,最慢,但保证完全的持久化

appendfsync everysec  #每一秒钟写入磁盘一次,在性能和持久化方面做了很好的折中,此为默认方式

appendfsync no  #完全依赖操作系统的自动写入磁盘机制,性能最好,持久化没保证

6. 发布及订阅消息

发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subcribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型,Redis将信息类型成为通道(channel)。当发布者通过publish命令向Redis server发送特定类型的信息时,订阅该类型信息的全部client都会收到此消息。

subscribe channel_name ...  订阅channel_name频道"..."代表可是同时订阅到过频道

publish channel_name ...  message  向channel_name频道中发布message消息

127.0.0.1:6379> publish tv1 "test message"

(integer) 2

127.0.0.1:6379> subscribe tv1 tv2

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "tv1"

3) (integer) 1

1) "subscribe"

2) "tv2"

3) (integer) 2

1) "message"

2) "tv1"

3) "test message"

注:先得subscribe订阅频道,publish才会成功

7. 虚拟内存的使用(Redis 3.0中虚拟内存配置取消了)

Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是其思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出内存用于其他需要访问的数据。尤其是对Redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个Redis server外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。相关配置如下:

vm-enabled yes        #开启vm功能,默认为no

vm-swap-file /tmp/redis.swap  #交换出来的value保存的文件路径

vm-max-memory 1000000   #Redis使用的最大内存上限

vm-page-size 32   #每个页面的大小32字节

vm-page 134217728   #最多使用多少页面

vm-max-threads 4    #用于执行value对象换入的工作线程数量

时间: 2024-10-11 01:48:40

点滴记录——学习Redis笔记的相关文章

小蚂蚁学习Redis笔记(2)——Redis安装和配置

Redis的安装 下载地址    http://redis.io/download 选择一个最新的稳定版本,目前是 redis-3.0.5.tar.gz (选择stable,稳定版本) 解压压缩包    tar -zxvf    redis-3.0.5.tar.gz 进入该目录    cd    redis-3.0.5 编译              make    这里需要注意一下,如果出现报错,记得最后一句有个error 2,使用了命令  make MALLOC=libc 即可. 安装   

小蚂蚁学习Redis笔记(5)——Redis数据类型之list类型

Redis之lists类型以及操作 list是一个链表结构,主要功能是push.pop,获取一个范围的所有值等等.操作中key理解为链表的名字.Redis的list类型其实就是一个每个子元素都是string类型的双向链表.可以通过push.pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,也可以作为队列. 栈和队列的特性    栈:先进后出:队列:先进先出. 1.    lpush    为链表的头部添加字符串元素 格式:    lpush    mylist1    "al

小蚂蚁学习Redis笔记(3)——Redis数据类型之string类型

昨天安装完毕,今天终于可以进入正题了. Redis中string类型的常用命令: string是最简单的类型,一个key对应一个value,string类型是二进制安全的类型,Redis的string可以包含任何数据,比如:图片或者序列化的对象. 1.    set    设置一对键值 格式:set    键    值        例如:set     name    "allen" 含义:添加一个键值对. 值得注意的是,这个命令在设置重复的key时,value是会覆盖的.它的作用是

小蚂蚁学习Redis笔记(1)——Redis简介、适用场景、对比

Nosql    =    not only sql    反sql运动,非关系型数据库 Nosql是以key-value形式存储,和传统的关系型数据库形成对比. Nosql有以下几个特点:非关系型的,分布式,开源的,水平可拓展的. 优点: 1. 处理超大量的数据    2. 运行在便宜的PC服务器集群上    3. 击碎了性能瓶颈 Nosql的适用场景: 1. 对数据高并发读写    2. 对海量数据的高效率存储和访问    3. 对数据的高可扩展性和高可用性 ps:扩展性好主要体现在它没有一

小蚂蚁学习Redis笔记(4)——Redis数据类型之hashes类型

hashes类型 hash是一个string类型的field和value的映射表.它特别适合用于存储对象.相较于将对象的每个字段存成单个的string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象. hashes常用命令 1.    hset    设置对象的字段和值 格式:    hset    user:001    name    "allen" 含义:为user:001这个对象,将它的name键设置一个值为allen. 注意:如果同样的对象,

学习ios笔记第一天的C语言学习记录

c语言基础学习 int num1 = 15; int num2 = 5; int temp = 0; //先把num1放到temp里 temp = num1; //先把num2放到num1里 num1 = num2; //先把temp放到num2里 num2 = temp; 算数运算符 +加法运算 -减法运算符 *乘法运算符 /除法运算符  ------整型相除取整,除数不为0 %取余运算符 ------两边均为整数 ++递增运算-------运算符在前,先执行:运算符在后,后执行: --递减运

系统学习redis之一——基础概念

前言: redis集群搭建过很多次,也用过一些基础的命令,能解决一些常规的异常.但是因为平时对数据这块用得不多,一直没有很系统的学习过redis.这次将redis的知识好好学习了一下,记录为学习笔记<系统学习redis>系列. NoSQL介绍 非关系型数据库:NoSQL关系型数据库:MySQL.SQLserver.Oracle 关系型数据库在web2.0上对高并发,暴露出了一些性能问题 NoSQL 是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,

[SQLServer]学习总结笔记(基本涵盖Sql的所有操作)

--################################################################################### /* 缩写: DDL(Database Definition Language): 数据库定义语言 DML(Database Manipulation Language): 数据库操作语言 DCL(Database Control Language): 数据库控制语言 DTM(Database Trasaction Manag

学习hibernate笔记

以前学习java的时候,一开始就学习了hibernate,那时候总觉得ssh非常高大上,所以就急忙看了下相关视频.不过因为实际需要不高,所以后来一直没有使用上hibernate组件.现在一年过去了,也疯狂学习了java一段时间了,做过几个不大的项目,但是总算对java有些了解.现在参加了工作,公司使用的就是ssh,所以这两天又重新开始捣鼓hibernate.这次学习直接使用editplus,直接开发.看了官网的demo,发现英语也没有想象中那么困难.哈哈,把自己的学习记录下来吧.这里主要记录三个