Redis(2015.08.03笔记一)
一、redis简介
Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求。
redis的键只能是字符串
redis的值支持多种数据类型:
1:字符串 string
2:哈希 hash
3:字符串列表 list
4:字符串集合 set 不重复(只用于string),无序
5:有序集合sorted set ,不重复,有序
6:HyperLogLog 结构(redis2.8.9版本才有,用来做基数统计的算法。)
特点:
高性能(Redis读的速度是11W次/s,写的速度是8.1W次/s)
原子性(保证数据的准确性,原子操作,)
持久存储(两种方式RDB/快照,AOF/日志)
主从结构(master-slave,负载均衡,高可用)
集群(3.0版本)
应用:应用在高并发和实时请求的场景。
新浪微博
hash:关注列表,粉丝列表
string:微博数,粉丝数(避免使用select count(*) from...)
sorted set:TopN,热门微博
redis使用的是c语言实验的
二、环境搭建
首先安装c的编译环境
yum -y install cpp
yum -y install binutils
yum -y install glibc
yum -y install glibc-kernheaders
yum -y install glibc-common
yum -y install glibc-devel
yum -y install gcc
yum -y install make
如果上面的软件都安装之后再执行make命令还报错,就需要在make命令后面加个选项了
make MALLOC=libc
http://www.phperz.com/article/14/1219/42002.html
redis安装部署(单机)
redis官网:http://redis.io/(中文www.redis.cn)
解压:tar -zxvf redis-2.8.19.tar.gz
编译、安装
make
make install(将redis-3.0.0/src目录下面的可执行文件拷贝到/usr/local/bin目录下面,作用是在其他目录下执行脚本不需要指定绝对路径或者需要切换到路径才能执行脚本,相当于添加环境变量(将src配置到PATH))
加压缩后,执行make命令编译redis
make install
拷贝配置文件
cp redis/redis.conf /etc/
修改配置文件redis.conf
daemonize yes(后台运行)
logfile /usr/local/redis/log(后台启动的日志文件存放路径)
启动
redis-server /etc/redis.conf [--port 6379]
redis客户端(client,连接到本地的数据库)
redis-cli [-h 127.0.0.1] [-p 6379]
-h(连接的是哪一个数据库)-p(是端口号)
关闭
redis-cli shutdown
其他路径都可以调用bin目录下的shell脚本,
目录下面
(启动)redis-server
daemonize yes(后台运行)
logfile /usr/local/redis/log(日志文件)
查进程ps –ef|grep redis
停止
停止后需要重新启动才能进入
三、redis的特性【多数据库】
多数据库
每个数据库对外都是以一个从0开始的递增数字命名,不支持自定义的
redis默认支持16个数据库,可以通过修改databases参数来修改这个默认值
redis默认选择的是0号数据库
SELECT 数字: 可以切换数据库
多个数据库之间并不是完全隔离的,flushall
0-15,修改配置文件(修改数值)
数据库之间是相互隔离的
清空所有的数据库(停掉这个命令)
四、redis基础命令
获得符合规则的键名称
keys 表达式(?,* ,[],\?)
判断一个键是否存在
exists key
删除键
del key
del key1 key2
批量删除
redis-cli del `redis-cli keys "key*"`
获得键值的数据类型type
返回值可能是这五种类型(string,hash,list,set,zset)
注意:redis不区分命令大小写
keys *(查询所有的键,*是通配符)
keys crxy*
key crxy?
\?(转义字符查询问号)
查询键是否存在exists crxy
删除键
(integer(整数),返回值是2,说明成功删除2个)
在外面执行key *操作
在外面批量删除满足某些条件的键,反引号执行命令并获取返回值,相当于先执行redis-cli,进入后再执行删除
将命令传给脚本执行
获取键的类型
redis的help命令
"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
列出的命令都是可以操作string类型的
按tab补全命令(小技巧)
五、redis数据类型之string
字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容)。一个字符串类型的值存储的最大容量是1GB
命令
set/get(setnx)
mset/mget
incr/decr/incrby/decrby/incrbyfloat
append(string键,假如储存的是2.1,可以认为这是个字符串,它可以转换为integer或者float类型)
strlen(查看值的长度)
可到官网查看
命令
set/get(setnx)
mset/mget(设置多个键值/查看多个键值)
setnx会判断是否处在(set直接赋值,不会判断值是否存在)
incr(每次递增加1,前提是值是数字类型,若不是则会报错)
递减删除1(decr)
每次递增加几incrby
可以是小数和负数
拼接append,获取字符串长度(strlen)
6表示字符串的长度
六、redis数据类型之hash
hash类型的值存储了字段和字段值的映射,字段值只能是字符串,不支持其他数据类型。hash类型的键至多可以存储2^32-1个字段。
hash类型适合存储对象:如图:1-1和1-2
redis可以为任何键增减字段而不影响其他键
命令
hset/hget/hmset/hmget/hgetall(hsetnx)
hexists,判断键中的属性是否存在
hincrby(hash类型没有hincr命令)
hdel
hkeys/hvals
hlen(获取键中包含多少个字段)
key=value
(键=值)
hset(储存)user:100(这是个有意义键名,用户:用户ID,方便以后查找),hget(查询)
hmset(同时设置多个属性),hmget(同时查询多个属性)Gender0、1性别是男或女
hsetnx(如果有就创建,否则不创建)
递增操作
hincrby
(hdel)删除某个字段
hget(查询键值)
exists user:100(通用查询键是否存在)
七、redis数据类型之list
list是一个有序的字符串列表,列表内部实现是使用双向链表(linked list)实现的。
list还可以作为队列使用(后面讲)
一个列表类型的键最多能容纳2^32-1个元素。
命令
lpush/rpush/lpop/rpop
llen/lrange(-1表示最后一个元素的位置,-2倒数第二个元素)
lrem(lrem key count value)count分为三种情况
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
lindex(查询指定角标数据)
lset(修改指定角标的元素)
ltrim(截取)
linsert before|after(向指定元素前后插入元素)
rpoplpush:将元素从一个列表转到另一个列表
Lpush是左侧插入,rpush是从列表右侧插入数据
lpop(从列表左侧弹出元素,弹出后就是删除列表中的元素),rpop(从列表右侧弹出元素)
负数就是获取最后一个元素的角标(当无法获知list里面有多少个元素时,-1当成最后一个元素的角标)
llen list是获取列表元素的长度
lrem list 2 a(正数,从列表的左侧开始查找,将正数个元素删掉,负数就是从右侧查找,删除绝对值个元素)
lrem list -1 a右侧
lrem list 0 a(如果是0就会删除所有元素)
lset修改指定角标的值
ltrim截取
插入
八、redis数据类型之set
set集合中的元素都是不重复的,无序的,一个集合类型键可以存储至多 2^23-1(long类型的最大值)个元素
set集合类型和list列表类型的相似之处,如图:2-1所示
命令
sadd/smembers/srem/sismember
sdiff/sinter(交集)/sunion(并集)
sdiffstore/sinterstore/sunionstore
scard(获取集合长度)/spop(随机从集合中取出并删除一个元素)
srandmember key [count]
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
sadd set a(随机插入a元素到set名称的集合)smembers set(获取集合里面的所有的元素,元素是无序的)
Srem set a b(删除集合里面的某些元素)(判断集合是否存在某个元素,返回值1/0(存在/不存在))
sdiff set set1(求集合set有的元素而集合set1却没有的元素,集合顺序互换改变求值也会互换)
sinter(求交集,集合顺序不影响)
并集
sunionstore aaa set set1 (将set和set1 并集储存在aaa)
srandmember set1 2(从集合中随机返回2个元素,2是正数,返回值小于等于集合元素数量,元素值不重复)
负数取的元素可能重复