redis学习笔记(一)
来源:互联网 发布:淘宝卖家服务助手 编辑:程序博客网 时间:2024/04/26 11:05
redis简要学习笔记(内容来自Redis入门指南,感谢原书作者)
Redis是非关系型数据库。
JS------JSSO格式:键值是存储。
php中,数组是以key-value存储。
NoSQL使用场景:
1.对数据高并发读写;
2.对海量数据的高效存储和访问;
3.对数据的高可扩展性和高可用性。
Redis支持的数据类型:string,hash,list(链表),set(集合),zset(有序集合)。
Redis使用场合:
1.取最新N个数据的操作;
2.排行榜应用,取TOP N操作;
3.需要精确设定过期时间的应用(如竞拍等);
4.计数器应用;
5.Uniq操作,获取某段时间所有数据排重值;
6.实时系统
7.构建实时消息系统(Pub/sub),发布订阅;
8.构建栈、队列;
9.缓存。
redis与mysql不同:
1.两者均有库的概念;2.redis无表、无行、无列,而mysql有。
string:
set/get/senx/setex/setrange(替换)/mset/msetnx/mget/getset(获取key旧值,并设置新值)/GETRANGE(GETRANGE NAME 0 4,获取NAME的[0~4]字符)
/INCR/INCRBY/DECR/DECRBY/APPEND/STRLEN
HASH:
redis的hash是string类型的filed和alue,即:hset key-name filed value
保存用户的信息较方便。
HSET/HGET/HSETNX/HMSET/HMGET(获取同一个key的所有字段的值)/HINCRBY/HEXISTS/HLEN(返回键的filed个数)/HDEL(删除对应的filed)/HKEYS(返回所有的字段)/HVALUES(返回hash表的所有value)/HGETALL(同时返回所有字段及其对应的值)
一.命令
1.自增:incr, incr foo 1 foo=1; 返回值是变量增加后的值
incrby需要加递增的进阶值,如incrby too 5 too=5
2.自减:decr, decr foo 1 foo=-1; 返回值是变量减少后的值
decrby 需要加递减的进阶值,如decrby too -5 too=-5
3.增加指定浮点数:incrbyfloat bar 2.7 bar=2.7 ;返回值是变量增加后的值
4.向尾部追加值append,append返回值是追加后字符串的总长度
set key hello key => hello
append key "world" key => helloworld
5.获取字符串的长度:strlen返回值是键值的长度
strlen key => 10 (key=> helloworld)
6.同时获得/设置多个键值:mset命令
mset key1 v1 key2 v2 key3 v3
mget key1 key2 key3,输出为:1):"v1" 2)"v2" 3)"v3"
get key1 => v1
7.位操作
getbit/setbit/bitcount/bitop
如set foo bar,bar的三个字母对应的ASCII码分别为98、97和114,转换成二进制分别为11000010、11000001和01110010
getbit命令可以获得第一个字符串类型键指定位置的二进制位的值(0或1)。getbit foo 0 输出0;getbit foo 6 输出1;如果需要获取的二进制位的值,超过了二进制自身的长度,则返回0。
setbit命令设置字符串对应比特位的值为1或者0. setbit foo 6 0;setbit foo 7 1;get foo 输出 aar
bitcount命令可以获得字符串类型键中值是1的二进制个数。 bitcount foo 10 输出10;bitcount foo 0 1,统计前两个字节中键值是1的个数。
bitop命令可以对多个字符串类型键值进行位运算,并将结果存储在destkey指定的键中。如:
set foo1 bar;set foo2 aar; bitop or res foo1 foo2, get res 输出car。
二、散列类型
1.命令: HSET key filed value
HGET key filed
GMSET key filed value filed value
HMGET key filed filed
HGETALL key
redis 127.0.0.1:6379> HSET car price 500
(integer) 1
redis 127.0.0.1:6379> hset car name bmw
(integer) 1
redis 127.0.0.1:6379> HGET car name
"bmw"
redis 127.0.0.1:6379> HSET car price 500
(integer) 0
redis 127.0.0.1:6379> HSET car price 1000
(integer) 0
redis 127.0.0.1:6379> HGET car name
"bmw"
redis 127.0.0.1:6379> HGET car price
"1000"
HSET不区分插入和更新。如果是执行插入操作(之前不存在对应的key)时,HSET命令返回1;如果执行的是更新操作(之前存在对应的key),HSET命令返回0.
注释:在Redis中每个键都属于一个明确的数据类型,如通过HSET命令建立的键是散列型,通过SET命令建立的键是字符串类型。使用一种类型数据操作另一种数据类型的键会提示错误。
当需要设置多个字段的值时候,可以使用HMSET命令。
HMSET key filed1 value1 filed2 value2
HMGET命令可以同时获得多个字段的值
redis 127.0.0.1:6379> HMGET car price name
1) "1000"
2) "bmw"
如果想获得键中所有的字段或者所有的值,但是却不知道有哪些字段时,可以使用HGETALL命令,如:
redis 127.0.0.1:6379> HGETALL car
1) "price"
2) "1000"
3) "name"
4) "bmw"
2.判断字段是否存在
HEXISTS命令用来判断一个字段是否存在。如果存在则返回1,否则返回0.
redis 127.0.0.1:6379> HEXISTS car price
(integer) 1
redis 127.0.0.1:6379> HEXISTS car model
(integer) 0
3.当字段不存在时赋值
HSETNX命令,HSETNX key ,failed, value 如果字段已经存在,HSETNX将不执行任何操作。
4.增加数字
redis 127.0.0.1:6379> HINCRBY person score 60
(integer) 60
redis 127.0.0.1:6379> hget person score
"60"
之前的person键不存在,HINCRBY命令会自动建立该键,并默认score在命令执行前的值为0.命令的返回值,是增值后的字段值。HINCRBYFLOAT是增加浮点数值。
5.删除字段
redis 127.0.0.1:6379> HINCRBYFLOAT person score 15.43
"75.43"
redis 127.0.0.1:6379> HDEL person score
(integer) 1
HDLE命令可以删除一个或多个字段,返回值是被删除的字段的个数。
6.只获取字段名或者字段值
HKEYS key ;仅获取键中所有字段的名字而不需要字段的值
HVALS key ;仅获得键中所有字段值
redis 127.0.0.1:6379> HKEYS car
1) "price"
2) "name"
redis 127.0.0.1:6379> HVALS car
1) "1000"
2) "bmw
7.获得字段数量 HLEN key
redis 127.0.0.1:6379> HLEN car
(integer) 2
三、列表类型
LIST类型(链表):既可以作为队列,又可以作为栈,同时也可以作为双向:既近也出。
LPUSH(从头部压入元素)/RPUSH(从尾部压入元素):都是从头开始取(从左边取),从两端对链表进行操作。
redis 127.0.0.1:6379> LPUSH mylist hello //(先近的是world)
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist world //(后近的是hello)
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "world"
2) "hello"
redis 127.0.0.1:6379> RPUSH list hello
(integer) 1
redis 127.0.0.1:6379> RPUSH list world
(integer) 2
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "world"
先近先出:队列
如果想从中间插入某个元素:
LINSERT(从中间插入元素)
下例子是先压入one,再压入two,如果想在中间压入three,则:
redis 127.0.0.1:6379> LPUSH list3 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list3 two
(integer) 2
redis 127.0.0.1:6379> LRANGE list3 0 -1
1) "two"
2) "one"
redis 127.0.0.1:6379> LINSERT list3 before one three //(没有rinsert)
(integer) 3
redis 127.0.0.1:6379> LRANGE list3 0 -1
1) "two"
2) "three"
3) "one"
LSET: 设定指定下标元素的值为value
redis 127.0.0.1:6379> LPUSH list5 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list5 two
(integer) 2
redis 127.0.0.1:6379> LPUSH list5 three
(integer) 3
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "two"
3) "one"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LSET list5 1 "new world"
OK
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "new world" //更改成功
3) "one"
LREM:(从key对应的list中删除n个和value相同的元素,n<0,从尾删,n=0全部删除对应的key,n>0.,从左侧头部删除)
LREM list5 3 one //从list5中删除3个one
LTRIM:(删除一定范围的元素)
LTRIM list8 1 -1 //保留1,-1位置元素,其他都删除。
redis 127.0.0.1:6379> LPUSH list8 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list8 two
(integer) 2
redis 127.0.0.1:6379> LPUSH list8 three
(integer) 3
redis 127.0.0.1:6379> LPUSH list8 four
(integer) 4
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LRANGE list8 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
redis 127.0.0.1:6379> LTRIM list8 1 2
OK
redis 127.0.0.1:6379> LRANGE list8 0 -1
1) "three"
2) "two" //只剩下1,2位置的three,two;其他的value都删除。
LPOP/LPUSH:从list的头部删除/添加一个元素;RPOP/LPUSH:从尾部弹出/添加一个元素。
rpoplpush:从第一个list的尾部移除元素并添加到第二个list的头部
示例:
redis 127.0.0.1:6379> LPUSH mylist5 hello
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist5 three
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist5 0 -1
1) "three"
2) "hello"
redis 127.0.0.1:6379> LPUSH mylist6 foo
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist6 hello
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist6 0 -1
1) "hello"
2) "foo"
redis 127.0.0.1:6379> RPOPLPUSH mylist5 mylist6
"hello"
redis 127.0.0.1:6379> LRANGE mylist5 0 -1
1) "three"
redis 127.0.0.1:6379> LRANGE mylist6 0 -1
1) "hello"
2) "hello"
3) "foo"
LINDEX:返回名称为key的list中Index位置的元素
LLEN:返回list中元素的长度。
1.向列表两端增加元素
LPUSH 用来向列表左边增加元素,返回值表示增加元素后列表的长度。
redis 127.0.0.1:6379> LPUSH numbers 1
(integer) 1
numbers中的元素为:【1】
LPUSH还支持同时增加多个元素,
redis 127.0.0.1:6379> LPUSH numbers 2 3
(integer) 3
操作之后,numbers中的元素为【3 2 1】
向列表中右边加如元素,为RPUSH,(以当前列表中第0个元素为基准)
redis 127.0.0.1:6379> RPUSH numbers 0 -1
(integer) 5
此时表中元素为:【3 2 1 0 -1】
2.从列表两端弹出元素
LPOP key ;从列表左边弹出一个元素,返回值是被删除的元素值
RPOP key ;从列表右边弹出一个元素,返回值是被删除的元素值
redis 127.0.0.1:6379> LPOP numbers
"3"
redis 127.0.0.1:6379> RPOP numbers
"-1"
LPUSH/RPUSH/LPOP/RPOP这4个命令,可以使用列表类型来模拟栈和队列操作:如果想把列表当作栈,则搭配使用LPUSH/LPOP或RPUSH/RPOP;如果想当成队列,则搭配LPUSH/RPOP或RPUSH/LPOP使用。
3.获取列表中元素的个数
LLEN key ;当键不存在时,会返回0,如果键存在,则返回键的个数。
redis 127.0.0.1:6379> LLEN numbers
(integer) 3
4.获得键的片段
LRANGE key star stop ;获取列表中的某一片段,返回值是索引从start到stop之间所有元素(包括两端元素,闭集);它支持负索引,表示从右边开始计算序数。(已从左边开始计算为基准,如果值>=0时)
redis 127.0.0.1:6379> LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"
redis 127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"
其中“-1”表示最右边的第一个元素,“-2“表示最右边第二个元素。
通过LRANGE numbers 0 -1 ;获取列表中所有元素
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
5.删除列表中指定的值
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "100"
5) "2"
redis 127.0.0.1:6379> LREM numbers -1 2
(integer) 1
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "100"
LREM key count value ;LREM会删除列表中前count个值为alue的元素,返回值是实际删除的元素个数。
当count > 0时,LREM命令会从列表左边开始删除前 |count| 个值为value的元素
count < 0时,LREM命令会从列表右边开始删除前 |count| 个值为value的元素
count = 0时,LREM命令会从从列表中删除所有值为value的元素
6.获得/设置指定索引的元素值
LINDEX key index ;返回指定索引的元素,索引从0开始;如果index 为负值,则从右边开始,最右边元素的索引为-1.
LSET key index value ; 将索引为Index的元素赋值为value ;如果Index超过当前的range,则报错为(error) ERR index out of range。
redis 127.0.0.1:6379> LINDEX numbers 3
"100"
redis 127.0.0.1:6379> LINDEX numbers -1
"100"
redis 127.0.0.1:6379> LINDEX numbers -5
(nil)
7.只保留列表指定片段
LTRIM key start end
LTRIM命令删除指定索引范围之外的所有元素,其指定列表范围的方法和LRANGE命令相同。
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "100"
redis 127.0.0.1:6379> LTRIM numbers 1 2
OK
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
LTRIM和LPUSH一起用来限制列表中元素的数量,比如记录日志时希望只保留最近的100条日志,则每次加入新元素时调用一次LTRIM命令即可:
LPUSH logs $newLog
LTRIM logs 0 99
8.向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
LINSERT 命令首先在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面,如果未找到该值,则返回-1.
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
redis 127.0.0.1:6379> LINSERT numbers after 0 1024
(integer) 3
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
3) "1024"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LINSERT numbers after 99 1024
(integer) -1
9.将元素从一个列表转到另一个列表
RPOPLPUSH source destnation
RPOPLPUSH功能:先执行RPOP命令,在执行LPUSH命令。RPOPLPUSH命令会先从source列表类型键的右边弹出一个元素,然后将其加入到destnation列表类型键的左边,并返回这个元素的值,整个过程是原子的。
当把列表当作为队列使用时,RPOPLPUSH命令可以直观的子多个队列中传递数据。当source和destination相同时,RPOPLPUSH命令会不断的将队尾的元素移到队首。这个特性可以实时监控网站:使用一个队列存储需要监控的网站,然后监控程序不断地使用RPOPLPUSH命令循环取出一个网址来测试可用性。
RPOPLPUSH好处在于:程序执行过程中,可以不断地向网址列表中加入新网址,允许多个客户端同时处理队列。
- Redis学习笔记一
- redis学习笔记(一)
- redis 学习笔记(一)
- Redis学习笔记一
- Redis学习笔记(一)
- Redis 学习笔记一
- redis学习笔记一
- redis 学习笔记一
- redis学习笔记一
- redis 学习笔记(一)
- redis学习笔记(一)
- Redis学习笔记(一)--认识Redis
- redis学习笔记一 之Redis 安装
- Redis的安装-Redis学习笔记一
- Redis服务器学习笔记(一)
- Redis学习笔记(一)
- Redis学习笔记一、开篇
- Redis学习笔记(一)
- JSP页面解决文件路径方法
- ubuntu设置简单密码
- wikioi p3027 线段覆盖 2
- C++实现设计模式:Observer Pattern
- php中分割网站网址取得特定参数
- redis学习笔记(一)
- C++ string详解
- MySQL-5.6.13 基本设置及其主从数据库
- POJ 1033 / Northeastern Europe 1998 Defragment (模拟&队列)
- 建造者模式
- Qt简介以及如何配置Qt使用VS2010进行开发
- 视图间跳转完成数据回调的四种方法
- 【数据结构】01.8种排序算法的稳定性和时间复杂度小结
- 阻塞和非阻塞IO