Table of Contents
1.图形界面客户端(客户端可自行下载[redis desktop manager])
2.1 第一步:编辑iptables /etc/sysconfig/iptables
3.1.1.4取值并赋值(当所取的key不存在时则自动创建一个,并赋值为value)
3.2.1使用str的问题(整条数据即使有的数据没有改变也会跟着更新)
3.2.3.5.1 判断字段是否存在(1为存在,0为不存在)
远程连接redis服务,需要关闭或者修改防火墙配置。
vi /etc/sysconfig/iptables
service iptables restart
注意:
默认一共是16个数据库,每个数据库之间是相互隔离。数据库的数量是在redis.conf中配置的。
Redis中存储数据是通过key-value存储的,对于value的类型有以下几种:
PS:
在redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的。
语法:set key value
127.0.0.1:6379> get test "123“ |
语法:
MSET key value [key value …]
MGET key [key …]
127.0.0.1:6379> mset key1 value1 key2 value2 127.0.0.1:6379> get key1 |
语法:getset key value
127.0.0.1:6379> getset key1 value2 "value1" 127.0.0.1:6379> get key1 "value2" |
语法:del key
127.0.0.1:6379> del test (integer) 1--------->(返回值为受影响的行数) |
当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。
语法:incr key (记:increase key)
127.0.0.1:6379> set num 1 OK 127.0.0.1:6379> get num "1" 127.0.0.1:6379> incr num (integer) 2 127.0.0.1:6379> incr num (integer) 3 127.0.0.1:6379> incr num (integer) 4 |
语法:incrby key increment
127.0.0.1:6379> incrby num 2 (integer) 6 127.0.0.1:6379> incrby num 2 (integer) 8 127.0.0.1:6379> incrby num 2 (integer) 10 |
语法:decr key
127.0.0.1:6379> decr num (integer) 9 127.0.0.1:6379> decr num (integer) 8 |
语法:decrby key decrement
127.0.0.1:6379> decrby num 2 (integer) 6 127.0.0.1:6379> decrby num 2 (integer) 4 |
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。
语法:append key value
127.0.0.1:6379> set str hello OK 127.0.0.1:6379> append str " world!" (integer) 12 127.0.0.1:6379> get str "hello world!" |
STRLEN命令返回键值的长度,如果键不存在则返回0。
语法:strlen str
127.0.0.1:6379> get str "hello world!" 127.0.0.1:6379> strlen str (integer) 12 |
商品编号、订单号采用string的递增数字特性生成。
定义商品编号key:items:id
127.0.0.1:6379> set item:id 1 OK 127.0.0.1:6379> incr item:id (integer) 2 127.0.0.1:6379> incr item:id (integer) 3 |
假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下:
保存、更新:
User对象 --> json(string) --> redis
如果在业务上只是更新age属性,其他的属性并不做更新我应该怎么做呢? 如果仍然采用上边的方法在传输、处理时会造成资源浪费,下边讲的hash可以很好的解决这个问题。
User “{“username”:”gll”,”age”:”18”}”
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
语法:hset key field value
127.0.0.1:6379> hset user username gll (integer) 1 |
127.0.0.1:6379> hset user username gll (integer) 1 127.0.0.1:6379> hmset user age 20 username gll2 OK |
语法:HSETNX key field value
127.0.0.1:6379> hsetnx user age 18 如果user中没有age字段则设置age值为18,否则不做任何操作 (integer) 0 127.0.0.1:6379> hsetnx user gender male (integer) 1 |
语法:hget key field
127.0.0.1:6379> hget user username "gll2" |
语法:hmget key field [field ...]
127.0.0.1:6379> hmget user username age gender 1) "gll2" 2) "20" 3) "male" |
语法:hgetall key
127.0.0.1:6379> hgetall user 1) "username" -->key 2) "gll2" -->value 3) "age" 4) "20" 5) "gender" 6) "male" |
语法:hdel key field [field ...]
127.0.0.1:6379> hdel user age ---------------------------------------------------------------- 127.0.0.1:6379> hgetall user |
语法:hincrby key field increment
127.0.0.1:6379> hset user age 18 (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> hincrby user age 2 (integer) 20 127.0.0.1:6379> hget user age "20" |
语法:hexists key field
127.0.0.1:6379> hexists user age (integer) 1 127.0.0.1:6379> hexists user name (integer) 0 |
语法:1)hkeys key , 2)hvals key
127.0.0.1:6379> hset user name gll 127.0.0.1:6379> hkeys user
|
语法:hlen key
127.0.0.1:6379> hlen user (integer) 3 |
[商品id,商品名称]
商品1001的信息在redis中的key为:[items:1001]
127.0.0.1:6379> hmset items:1001 id 1001 name bag OK 127.0.0.1:6379> hmset items:1002 id 1002 name book OK |
127.0.0.1:6379> hget items:1001 id "1001" 127.0.0.1:6379> hgetall items:1001 1) "id" 2) "1001" 3) "name" 4) "bag" |
ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢。
LinkedList使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快。然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元素或后几个元素速度比较快。
列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
向列表左边增加元素
语法:lpush key value [value ...]
127.0.0.1:6379> lpush list:1 1 2 3 (integer) 3 |
向列表右边增加元素
语法:rpush key value [value ...]
127.0.0.1:6379> rpush list:1 4 5 6 (integer) 6 |
LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。
语法:lrange key start stop
127.0.0.1:6379> lrange list:1 0 3 127.0.0.1:6379> lrange list:1 0 -1 |
LPOP命令从列表左边弹出一个元素,会分两步完成:
第一步是将列表左边的元素从列表中移除
第二步是返回被移除的元素值。
语法:
lpop key(左边弹出)
rpop key(右边弹出)
127.0.0.1:6379> lpop list:1 "3" -->显示的是弹出去的值为3 127.0.0.1:6379> rpop list:1 "6" -->显示的是弹出去的值为6 |
语法:llen key (记忆:list length)
127.0.0.1:6379> llen list:1 (integer) 4 |
lrem(记忆:list remove)命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:
语法:lrem key count value
127.0.0.1:6379> lpush list:2 4 3 2 1 1 2 3 4 (放置8个数) (integer) 8 |
127.0.0.1:6379> lrem list:2 1 3 (从左边(上边)弹出一个值为3的数) 127.0.0.1:6379> lrange list:2 0 -1 |
127.0.0.1:6379> lrem list:2 -1 4 (从右边(下边)弹出一个值为4的数) (integer) 1 127.0.0.1:6379> lrange list:2 0 -1 1) "4" 2) "2" 3) "1" 4) "1" 5) "2" 6) "3" |
127.0.0.1:6379> lrem list:2 0 2 (integer) 2 127.0.0.1:6379> lrange list:2 0 -1 1) "4" 2) "1" 3) "1" 4) "3" |
语法:lindex key index
获取list:1中1的位置
127.0.0.1:6379> lindex list:1 1 "1" |
语法:lset key index value
127.0.0.1:6379> lset list:1 2 8 OK 127.0.0.1:6379> lrange list:1 0 -1 1) "2" 2) "1" 3) "8" 4) "5" |
指定范围和lrange一致
语法:ltrim key start stop
127.0.0.1:6379> ltrim list:1 0 2 OK 127.0.0.1:6379> lrange list:1 0 -1 1) "2" 2) "1" 3) "8" |
该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
语法:linsert key before/after pivot value
127.0.0.1:6379> linsert list:1 after 1 7 (integer) 4 127.0.0.1:6379> lrange list:1 0 -1 1) "2" 2) "1" 3) "7" 4) "8" |
语法:rpoplpush source destination
127.0.0.1:6379> lrange list:1 0 -1 1) "2" 2) "1" 3) "7" 4) "8" 127.0.0.1:6379> lrange list:2 0 -1 1) "4" 2) "1" 3) "1" 4) "3" 127.0.0.1:6379> rpoplpush list:1 list:2 "8" 127.0.0.1:6379> lrange list:1 0 -1 1) "2" 2) "1" 3) "7" 127.0.0.1:6379> lrange list:2 0 -1 1) "8" 2) "4" 3) "1" 4) "1" 5) "3" |
思路:
在Redis中创建商品评论列表
用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。
定义商品评论列表key:
商品编号为1001的商品评论key【items: comment:1001】
127.0.0.1:6379> lpush items:comment:1001 '{"id":"1","name":"商品很好"}' (integer) 1 |
集合中的数据是不重复且没有顺序。
集合类型和列表类型的对比:
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为0(1)。
Redis还提供了多个集合之间的交集、并集、差集的运算。
语法:sadd key member [member ...]
127.0.0.1:6379> sadd set a b c (integer) 3 127.0.0.1:6379> sadd set a (当元素存在时,返回0,不插入重复数据) (integer) 0 |
语法:srem key member [member ...]
127.0.0.1:6379> sadd set a 127.0.0.1:6379> smembers set |
语法:sismember key member (记忆:set is member)
127.0.0.1:6379> sismember set a (integer) 0 不存在返回0 127.0.0.1:6379> sismember set b (integer) 1 存在返回1 |
属于A并且不属于B的元素构成的集合(哪个集合写在前则属于谁)
127.0.0.1:6379> sadd setA a b (integer) 2 127.0.0.1:6379> sadd setB a b c (integer) 3 127.0.0.1:6379> sdiff setA setB (empty list or set) 127.0.0.1:6379> sdiff setB setA 1) "c" |
属于A且属于B的元素构成的集合
语法:sinter key [key ...]
127.0.0.1:6379> sinter setA setB 1) "a" 2) "b" |
属于A或者属于B的元素构成的集合
语法:sunion key [key ...]
127.0.0.1:6379> sunion setA setB 1) "a" 2) "c" 3) "b" |
语法:scard key
127.0.0.1:6379> smembers setA 127.0.0.1:6379> scard setA |
注意:由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出
语法:spop key
127.0.0.1:6379> spop setA "b" 127.0.0.1:6379> smembers setA 1) "a" |
在集合类型的基础上,有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。
在某些方面有序集合和列表类型有些相似。
1、二者都是有序的。
2、二者都可以获得某一范围的元素。
但是,二者有着很大区别:
1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
2、有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
4、有序集合要比列表类型更耗内存。
向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。 (主要用于网站流量统计,分数统计排行)
语法:zadd key score member [score member ...]
127.0.0.1:6379> zadd score 90 gll 70 clz (integer) 2 |
127.0.0.1:6379> zadd score 80 gl (integer) 1 |
语法:zscore key member
127.0.0.1:6379> zscore score gll "90" |
移除有序集key中的一个或多个成员,不存在的成员将被忽略。
当key存在但不是有序集类型时,返回一个错误。
127.0.0.1:6379> zrem score gl (integer) 1 |
获得排名在某个范围的元素列表
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
语法:zrange key start stop [withscores]
127.0.0.1:6379> zrange score 0 2 1) "clz" 2) "gll" 127.0.0.1:6379> zrange score 0 -1 (-1代表一直到结尾结束) 1) "clz" 2) "gll" |
按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
语法:zrevrange key start stop [withscores] (记忆:z reverse range)
127.0.0.1:6379> zrevrange score 0 2 1) "gll" 2) "clz" |
如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数
127.0.0.1:6379> zrevrange score 0 2 withscores 1) "gll" 2) "90" 3) "clz" 4) "70" |
语法:zrangebyscore key min max [withscores] [limit offset count]
127.0.0.1:6379> zrangebyscore score 70 80 127.0.0.1:6379> zrangebyscore score 70 80 limit 0 2 127.0.0.1:6379> zrangebyscore score 70 80 limit 2 2 |
返回值是更改后的分数
语法:zincrby key increament member
127.0.0.1:6379> zincrby score 5 lisi "65" |
语法:zcard key
127.0.0.1:6379> zcard score (integer) 5 |
zcount key min max
127.0.0.1:6379> zcount score 60 80 (integer) 4 |
语法:zremrangebyrank key start stop
127.0.0.1:6379> zremrangebyrank score 0 1 127.0.0.1:6379> ZRANGE score 0 -1 |
语法:zremrangebyscore key min max
127.0.0.1:6379> ZRANGE score 0 -1 withscores 127.0.0.1:6379> zremrangebyscore score 85 95 |
语法:zrank key member
127.0.0.1:6379> zrank score wangwu 127.0.0.1:6379> zrank score lzhangsan |
语法:zrenrank key member
127.0.0.1:6379> zrevrank score lzhangsan (integer) 0 127.0.0.1:6379> zrevrank score wangwu (integer) 1 |
需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。
写入商品销售量:
商品编号1001的销量是9,商品编号1002的销量是10
127.0.0.1:6379> zadd items:sellsort 9 1001 10 1002 (integer) 2 |
商品编号1001的销量加1
127.0.0.1:6379> zincrby items:sellsort 1 1001 "10" |
商品销售前10名
127.0.0.1:6379> zrange items:sellsort 0 9 withscores 1) "1001" 2) "10" 3) "1002" 4) "10" |
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。
EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除 TTL key 查看key生于的生存时间 PERSIST key 清除生存时间 PEXPIRE key milliseconds 生存时间设置单位为:毫秒 |
举个栗子
127.0.0.1:6379> set test 1 设置test值为1 OK 127.0.0.1:6379> get test 获取test值 "1" 127.0.0.1:6379> expire test 5 设置test的生存时间为5秒(expire 意为"到期") (integer) 1 127.0.0.1:6379> ttl test 查看test的剩余生存时间还有1秒 (integer) 1 127.0.0.1:6379> ttl test 在此获取生存时间,返回值为-2,说明该值过期 (integer) -2 127.0.0.1:6379> get test 获取test的值,为空,已经删除 (nil) |
返回满足给定pattern的所有key
127.0.0.1:6379> keys set* 1) "set" 2) "setA" 3) "setB" |
确认一个key是否存在(返回值为0则不存在,返回值为1则存在)
127.0.0.1:6379> EXISTS set (integer) 1 存在 127.0.0.1:6379> EXISTS seta (integer) 0 不存在 |
删除一个key
127.0.0.1:6379> del set (integer) 1 127.0.0.1:6379> EXISTS set (integer) 0 |
重命名key
127.0.0.1:6379> rename num number |
返回值的类型
127.0.0.1:6379> type key1 127.0.0.1:6379> type items:1001 hash 127.0.0.1:6379> type list:1 list 127.0.0.1:6379> type items:sellsort zset |