redis数据库初步学习

1.redis的安装

1)安装redis编译的c环境,yuminstall gcc-c++

2)redis-2.6.16.tar.gz上传到Linux系统中

3)解压到/usr/local tar -xvf redis-2.6.16.tar.gz -C /usr/local

4)进入redis-2.6.16目录 使用make命令编译redis

5)redis-2.6.16目录中 使用makePREFIX=/usr/local/redis install命令安装               redis/usr/local/redis

6)拷贝redis-2.6.16中的redis.conf到安装目录redis

7)启动redis bin下执行命令redis-serverredis.conf

8)如需远程连接redis,需配置redis端口6379linux防火墙中开发

2.通过java程序访问redis

@Test
 public void test1() {
  //获得连接对象
  Jedis jedis=new Jedis("192.168.219.128",6379);//安装redis数据库的ip地址和对应端口
  
  //2.获得数据
  String username=jedis.get("username");
  System.out.println(username);
  
  //3.存储
  jedis.set("addr", "北京");
  System.out.println(jedis.get("addr"));
 }

使用jeds直接访问

3.通过jeds的pool获得jedis连接对象

	@Test
	public void test2() {
		//1.创建连接池的配置对象
		JedisPoolConfig poolConfig=new JedisPoolConfig();
		poolConfig.setMaxIdle(30);//最大闲置个数
		poolConfig.setMinIdle(10);//最小闲置个数
		poolConfig.setMaxTotal(50);//最大连接数
		
		//2.创建redis连接池
		JedisPool pool=new JedisPool(poolConfig,"192.168.219.128",6379);
		
		//3.从连接池获取redis连接资源
		Jedis jedis=pool.getResource();
		
		//4.操作数据库
		jedis.set("age", "13");
		System.out.println(jedis.get("age"));
		
		//5.关闭资源
		jedis.close();
		pool.close();//实际开发中不会关掉
	}

可以自己封装一个获取jedis的资源的工具,如下

public class JedisPoolUtil {

	private static JedisPool pool=null;
	
	static {
		//加载配置文件
		InputStream inputStream=JedisPoolUtil.class.getClassLoader().getResourceAsStream("redis.properties");
		Properties properties=new Properties();
		try {
			properties.load(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
				
		//1.创建连接池的配置对象
		JedisPoolConfig poolConfig=new JedisPoolConfig();
		poolConfig.setMaxIdle(Integer.parseInt(properties.getProperty("redis.maxIdle").toString()));//最大闲置个数
		poolConfig.setMinIdle(Integer.parseInt(properties.getProperty("redis.minIdle").toString()));//最小闲置个数
		poolConfig.setMaxTotal(Integer.parseInt(properties.getProperty("redis.maxTotal").toString()));//最大连接数
		
		//2.创建redis连接池
		pool=new JedisPool(poolConfig,properties.getProperty("redis.url"),Integer.parseInt(properties.getProperty("redis.port").toString()));		
	}
	public static Jedis getJedis() {
		return pool.getResource();
		
	}
}

配置文件如下

redis.maxIdle=30
redis.minIdle=10
redis.maxTotal=100
redis.url="192.168.219.128"
redis.port=6379

4.Redis的数据类型

redis是一种高级的key-value的存储系统

其中的key是字符串类型,尽可能满足如下几点:

1)key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低查找 效率

2)key不要太短,如果太短会降低key的可读性

3)在项目中,key最好有一个统一的命名规范(根据企业的需求)

其中value  支持五种数据类型:

1)字符串型 string

2)字符串列表 lists

3)字符串集合 sets

4)有序字符串集合 sorted sets

5)哈希类型 hashs


4.1存储String

set key value 增

            get key 查

            del key 删

          incr key 数值增(必须是Integer)如果incr key1(key1在数据库不存在,则会自动创造一个出来),get key1 得value="1"

            decr key 数值减(必须是Integer)如果incr key2(key2在数据库不存在,则会自动创造一个出来),get key2 得value="-1"

4.2存储Hash

Redis中的Hashes类型可以看成具有String KeyString Valuemap容器。所以该类型非常适合于存储值对象的信息。如UsernamePasswordAge等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。


hset key filed value 为指定的key设置filed/value值

hget key filed 取出指定的key/filed的值

hmset key filed value[] 一次指定多个filed/value值

hmget key filed valus[] 一次取出多个filed/value

hgetall key 取出所有filed/value

hdel key filed 删除指定的filed/value

del key 删除所有filed/value

hincrby key filed increment 数值增加increment,可以增加负数

4.3存储List

Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于数组中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。

lpush key value[] 在key关联的list的头部添加多个value
lrange key start end 查询从start到end的value(先进后出)
rpush key value[]  在key关联的list的尾部添加多个value
lpop key 从头部弹

rpop 从尾部弹

llen key 获取长度

4.4存储Set

Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间是常量时间。Set可包含的最大元素数4294967295List类型不同的是,Set集合中不允许出现重复的元素。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unionsintersectionsdifferences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销


sadd key value1value2…:向set中添加数据,如果该key的值已有则不会重复添加

smembers key:获取set中所有的成员

scard key:获取set中成员的数量

sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在

srem key member1member2…:删除set中指定的成员

srandmember key:随机返回set中的一个成员

sdiff sdiff key1 key2:返回key1key2中相差的成员,而且与key的顺序有关。即返回差集。

sdiffstoredestination key1 key2:将key1key2相差的成员存储在destination

4.5存储sortedset

Sorted-SetsSets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。

Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为 集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。

zadd key score member score2 member2 :将所有成员以及该成员的分数存放到sorted-set

zcountkey min max:获取分数在[min,max]之间的成员

zcardkey:获取集合中的成员数量

zincrby key incrementmember:设置指定成员的增加的分数。

zrange key start end[withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数。

zrangebyscore key minmax [withscores] [limit offset count]:返回分数在[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数;[limit offset count]offset,表明从脚标为offset的元素开始并返回count个成员。

5.redis的keys通用操作

keys pattern:获取所有与pattern相匹配的key

del key[]:删除多个key

exist 可以:查询是否存在key

rename key newkey:重命名

expire key time(秒)  设置过期时间

ttl key:返回过期时间,若果没有设置,返回-1;若果已经过期返回-2

type key: 获取指定key的类型

6.消息订阅与发布

subscribe channel:订阅频道

psubscribe channel:批量订阅

publish channnel content:在指定的频道中发布消息

7.redis事务

multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令序列,知道执行exec时,这些命令才会被原子的执行,类似于关系型数据库中的:begin transcation

exec:提交事务,类似于关系型数据库中的:commit

discard:事务回滚,类似于关系型数据库中的:rollback

8.持久化

  Redis的高性能是由于其将所有的数据都存储在内存中,为了使Redis再重启后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

  Redis支持两种方式持久化,一种是RDB,一种是AOF。可以单独使用一种或配合使用。

1.RDB持久化(默认支持,无需配置)

  该机制是指在指定时间间隔内江内存中的数据集跨爱找写入磁盘。。

2.AOF持久化

   该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动指出会读取该文件来重新构建数据库,以保证自启动后数据库中的数据是完整的。

3.无持久化

  可以通过配置的方式禁用Redis服务器的持久化功能,这样我们可以将Redis视为一个功能加强的的memcached了。

4.同时使用


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值