Redis是一个开源的,使用ANSI C 编写,高性能的Key-Value的NoSQL数据库。
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -xzvf redis-5.0.5.tar.gz
cd redis-5.0.5/deps/jemalloc/
./configure
缺少什么就安装什么
回到源码根目录
make
make install
cp redis.conf /etc/redis.conf
redis-server /etc/redis.conf
给redis设置密码,去掉#号,修改自己需要的密码。在客户端使用auth命令,验证密码。
Redis默认有16个数据库,寻址角标从0开始。默认连接db0
客户端使用select命令,切换数据库
指定redis的服务端口,默认6379.
Redis默认关闭后台进程模式,改成yes,redis服务在后台启动。
Redis日志输出目录,默认不输出日志到文件。
指定数据持久化的文件名及目录。
修改配置文件,将daemonize改为yes
说明:Linux 系统服务,在 /etc/init.d 目录下创建 redis 脚本
###########################
#chkconfig: 2345 10 90
#description: Start and Stop redis
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
##判断redis是否启动了
PIDFILE=/var/run/redis_6379.pid
CONF="/etc/redis.conf"
PASSWORD=$(cat $CONF|grep '^s*requirepass'|awk '{print $2}'|sed 's/"//g')
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
if [ -z $PASSWORD ]
then
$REDIS_CLI -p $REDISPORT shutdown
else
$REDIS_CLI -a $PASSWORD -p $REDISPORT shutdown
fi
#$REDIS_CLI -p $REDISPORT SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
##############################
chmod +x /etc/init.d/redis
chkconfig --add redis
chkconfig redis on
Redis的数据结构类型,指的就是redis的值value的类型。
Redis常用的数据结构类型:string、list、set、sortedSet、hash
redis的key 值是二进制储存的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。
redis建议使用字符串做为key的类型
127.0.0.1:6379> set user:id:1:username lisi
OK
127.0.0.1:6379> set user:id:1:password 111111
OK
127.0.0.1:6379> set user:id:1:email [email protected]
OK
127.0.0.1:6379> keys user:id:1* #查找有几个属性
1) "user:id:1:password"
2) "user:id:1:username"
3) "user:id:1:email"
Redis的key是单线程模式,这就意味一瞬间只有一个线程能够持有这个key,所以可以使用redis解决部分涉及线程安全的业务。比如,在初级时候通过多线程模拟卖票,使用加锁的方式,保证只有一个线程能够持有锁,进行买票业务。
检查给定key是否存在。注意事项: 不支持通配符
删除一个key
del key1 key2 key3 删除多个key
查找所有符合给定模式 pattern 的 key 。
指定key的过期时间。新添加的key,如果没有指定过期时间,则会一直保存。
可以对一个已经带有生存时间的key执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。
查看某个key的剩余过期时间,返回值:
其它 表示剩余的生存时间,单位为秒。
语法格式:rename key newkey
将 key 改名为 newkey 。
127.0.0.1:6379> set orgKey yes
OK
127.0.0.1:6379> set newKey no
OK
127.0.0.1:6379> rename orgKey newKey
OK
127.0.0.1:6379> keys *
1) "newKey"
127.0.0.1:6379> get newKey
"yes"
查看key对应的value的数据结构类型。
获取某一个key的值
string类型是redis最常用的数据结构类型,存储的值为字符串。
设置一个key,值为value,类型为String类型;如果这个key已经存在,则更新这个key的值。
返回值
如果这个key不存在,则设置一个key,值为value;如果key存在,则不做更新。
返回值
获取key对应的value值;如果key不存在,则返回nil
一次获取多个key的值,如果对应key不存在,则对应返回nil。
将 key 中储存的数字值增一,然后返回。如果这个key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。
如果这个key对应的value值,不能表示数字,则会返回一个错误。
将key增加指定的步长值。increment是步长
将 key 中储存的数字值减一,然后返回。如果这个key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。
如果这个key对应的value值,不能表示数字,则会返回一个错误。
将key减少对应的步长值。
如果key已经存在,则将value追加到这个key原先的value值的末尾。如果这个key不存在,则执行set操作。
列表的索引:
将一个或多个值value插入到列表key的表头(即从左边插入);
如果有多个value值,那么各个value值按从左到右的顺序依次插入到表头:比如说,对空列表mylist执行命令LPUSH mylist a b c
,列表的值将是 c b a 这等同于原子性地执行 LPUSH mylist a
、 LPUSH mylist b
和 LPUSH mylist c
三个命令;
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
尾部添加(从右向左),操作同上。
返回key对应list的长度,key不存在返回0,如果key对应类型不是list返回错误
获取 list 某一元素,index是元素在list列表中的下角标,从0开始; lindex 是从左到右取元素
获取指定区间的所有元素; 下角标从0开始,0表示第一个元素,1表示第二个,依次类推;-1表示最后一个元素,-2表示倒数第二个元素,依次类推;
移除并返回列表中的第一个元素
移除并返回列表中的最后一个元素。
设置hash field为指定值,如果key不存在,则先创建;如果field已经存在,那么将更新这个field的值。
获取指定的hash field
获取全部指定的hash filed
同时设置hash的多个field
测试指定field是否存在
删除指定的hash field
返回指定hash的field数量
返回hash的所有field
返回hash的所有value
返回hash的所有filed和value
节约内存空间!
redis每创建一个键,都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等),redis的key相对于值来说,更珍贵!!!
所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,在获取key对应的value值时cpu的开销也会更多。Hash结构可以将具有关联关系的一组key-value,存储到同一个hash结构中,从而减少key的数量。
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
当 key 不是集合类型时,返回一个错误。
返回集合 key 中的所有成员。不存在的 key 被视为空集合。
移除并返回集合中的一个随机元素。当key不存在或key是空集时,返回nil。
返回集合key的基数(集合中元素的数量)。当key不存在时,返回0。
sinter key [key ...] 返回一个集合的全部成员,该集合是所有给定集合的交集。不存在的 key 被视为空集。
返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。
返回一个集合的全部成员,该集合是所有给定集合之间的差集。不存在的 key 被视为空集。
如: zadd set1 1 zhangsan 2 lisi
如: zrange set1 0 10
如: zcount set1 0 10
如 : zcard set1
如: zrank set1
如: zrem set1 zhangsan
注意事项: 1. 必须要放开redis允许启动主机访问。注释 /etc/redis.conf
的 bind 127.0.0.1
这句话
项目结构:
测试代码:
import java.util.Set;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class TestJedis {
@Test
public void testJedisConnect(){
// 连接redis服务器端(使用host)
@SuppressWarnings("resource")
Jedis jedis = new Jedis("192.168.56.128");
System.out.println("连接redis服务端成功!");
//测试redis服务器是否正在运行
System.out.println("redis服务器正在运行吗?"+ jedis.ping());
System.out.println("redis服务器信息?n"+ jedis.info());
}
}
Redis持久化,就是将内存中的数据,永久保存到磁盘上。Redis持久化有两种方式:RDB(Redis DB)、AOF(AppendOnlyFile)
在默认情况下,Redis 将数据库快照保存在名字为dump.rdb的二进制文件中,可以在redis.conf配置文件中修改持久化信息。
按照配置文件中的条件满足就执行BGSAVE
客户端(redis-cli)发起SAVE命令
Append only file,采用追加的方式保存,默认文件appendonly.aof。记录所有的写操作命令,在服务启动的时候使用这些命令就可以还原数据库
AOF默认关闭,需要在配置文件中手动开启。
说明:AOF机制,添加了一个内存缓冲区(buffer)。
appendfsync 选项,这个选项的值可以是always、everysec或者no
运行速度:always的速度慢,everysec和no都很快
AOF文件过大,合并重复的操作,AOF会使用尽可能少的命令来记录。
重写的本质:就是将操作同一个键的命令,合并。从而减小AOF文件的体积
auto-aof-rewrite-min-size
,触发AOF重写所需的最小体积:只要在AOF文件的体积大于等于size时,才会考虑是否需要进行AOF重写,这个选项用于避免对体积过小的AOF文件进行重写auto-aof-rewrite-percentage
,指定触发重写所需的AOF文件体积百分比:当AOF文件的体积大于auto-aof-rewrite-min-size指定的体积,并且超过上一次重写之后的AOF文件体积的percent %时,就会触发AOF重写。(如果服务器刚刚启动不久,还没有进行过AOF重写,那么使用服务器启动时载入的AOF文件的体积来作为基准值)。将这个值设置为0表示关闭自动AOF重写。